home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
CRS
/
crs49.d81
/
hack10d.sfx
/
issue10d
Wrap
Text File
|
1990-02-12
|
90KB
|
1,991 lines
2. ┬╒╞╞┼╥╙
┬YTES RECEIVED ARE PLACED IN "CIRCULAR" OR "RING" BUFFERS BY THE SAMPLE
ROUTINE BELOW, AND ALSO BY THE FIRST SAMPLE TRANSMIT ROUTINE. ╘O KEEP THINGS
SIMILAR TO THE ╦ERNAL ╥╙-232 IMPLEMENTATION, WE'VE SHOWN 256-BYTE BUFFERS.
┘OU MAY WANT TO USE LARGER BUFFERS FOR FILE TRANSFERS OR TO ALLOW MORE
SCREEN-PROCESSING TIME. ┬YPASSING THE ╦ERNAL ROUTINES FREE MANY ZERO-PAGE
LOCATIONS, WHICH COULD IMPROVE PERFORMANCE OF POINTERS TO LARGE BUFFERS.
╔F YOUR PROGRAM ALREADY DIRECTLY MANIPULATES THE ╦ERNAL ╥╙-232 BUFFERS, YOU'LL
FIND IT VERY EASY TO ADAPT TO THE ┴├╔┴. ╔F YOU USE CALLS TO THE ╦ERNAL ╥╙-232
FILE ROUTINES INSTEAD, YOU'LL NEED TO IMPLEMENT LOWER-LEVEL CODE TO GET AND
STORE BUFFER DATA.
┬RIEFLY, EACH BUFFER HAS A "HEAD" AND "TAIL" POINTER. ╘HE HEAD POINTS TO THE
NEXT BYTE TO BE REMOVED FROM THE BUFFER. ╘HE TAIL POINTS TO THE NEXT FREE
LOCATION IN WHICH TO STORE A BYTE. ╔F THE HEAD AND TAIL BOTH POINT TO THE
SAME LOCATION, THE BUFFER IS EMPTY. ╔F (TAIL+1)==HEAD, THE BUFFER IS FULL.
╘HE INTERRUPT HANDLER DESCRIBED BELOW WILL PLACE RECEIVED BYTES AT THE TAIL OF
THE RECEIVE BUFFER. ┘OUR PROGRAM SHOULD MONITOR THE BUFFER, EITHER BY
COMPARING THE HEAD AND TAIL POINTERS (AS THE ├OMMODORE ╦ERNAL ROUTINES DO), OR
BY MAINTAINING A BYTE COUNT THROUGH THE INTERRUPT HANDLER (AS THE ATTACHED
SAMPLE DOES). ╫HEN BYTES ARE AVAILABLE, YOUR PROGRAM CAN PROCESS THEM, MOVE
THE HEAD POINTER TO THE NEXT CHARACTER, AND DECREMENT THE COUNTER IF YOU USE
ONE.
┘OU SHOULD SEND A "├TRL-╙" (┴╙├╔╔ 19) TO THE HOST WHEN THE BUFFER IS NEARING
CAPACITY. ┴T HIGHER BAUD RATES, THIS "MAXIMUM SIZE" POINT MAY NEED TO BE
LOWERED. ╫E FOUND 50 TO 100 BYTES WORKED FAIRLY WELL AT 9600 BAUD. ┘OU CAN
PROBABLY DO THINGS MORE EFFICIENTLY (WE WERE USING A _VERY_ ROUGH
IMPLEMENTATION) AND SET A HIGHER MAXIMUM SIZE. ┴T SOME "MAXIMUM SIZE", A
"├TRL-╤" (┴╙├╔╔ 17) CAN BE SENT TO THE HOST TO RESUME TRANSMISSION.
╘O TRANSMIT A BYTE USING THE LOGIC OF THE FIRST TRANSMIT ROUTINE BELOW, FIRST
MAKE SURE THAT THE TRANSMIT BUFFER ISN'T FULL. ╘HEN STORE THE BYTE AT THE
TAIL OF THE TRANSMIT BUFFER, POINT THE TAIL TO THE NEXT AVAILABLE LOCATION,
AND INCREMENT THE TRANSMIT BUFFER COUNTER (IF USED).
╘HE 6551 TRANSMIT INTERRUPT OCCURS WHEN THE TRANSMIT REGISTER IS EMPTY AND
AVAILABLE FOR TRANSMITTING ANOTHER BYTE. ╒NLESS THERE ARE BYTES TO TRANSMIT,
THIS CREATES UNNECESSARY INTERRUPTS AND WASTES A LOT OF TIME. ╙O, WHEN THE
LAST BYTE IS REMOVED FROM THE BUFFER, THE INTERRUPT HANDLER IN THE FIRST
TRANSMIT ROUTINE BELOW DISABLES TRANSMIT INTERRUPTS.
┘OUR PROGRAM'S CODE THAT STUFFS NEW BYTES INTO THE TRANSMIT BUFFER MUST
RE-ENABLE TRANSMIT INTERRUPTS, OR YOUR BYTES MAY NEVER BE SENT. ┴ MODEL FOR A
MAIN CODE ROUTINE FOR PLACING BYTES INTO THE TRANSMIT BUFFER FOLLOWS THE
SAMPLE INTERRUPT HANDLER.
╒SING A TRANSMIT BUFFER ALLOWS YOUR MAIN PROGRAM TO PERFORM OTHER TAKES WHILE
THE ╬═╔ INTERRUPT ROUTINE TAKES CARE OF SENDING BYTES TO THE ┴├╔┴. ╔F THE
BUFFER HAS MORE THAN A FEW CHARACTERS, HOWEVER, YOU MAY FIND THAT MOST OF THE
PROCESSOR TIME IS SPENT SERVICING THE INTERRUPT. ╙INCE THE ┴├╔┴ GENERATES ╬═╔
INTERRUPTS, YOU CAN'T "MASK" THEM FROM THE PROCESSOR, AND YOU MAY HAVE TIMING
DIFFICULTIES IN YOUR PROGRAM.
╧NE SOLUTION IS TO ELIMINATE THE TRANSMIT BUFFER COMPLETELY. ┘OUR PROGRAM CAN
DECIDE WHEN TO SEND EACH BYTE AND PERFORM ANY OTHER NECESSARY TASKS IN BETWEEN
BYTES AS NEEDED. ┴ MODEL FOR THE MAIN-CODE ROUTINE FOR TRANSMITTING BYTES
WITHOUT A TRANSMIT BUFFER IS ALSO SHOWN FOLLOWING THE SAMPLE INTERRUPT-HANDLER
CODE. ╞EEDBACK FROM DEVELOPERS TO DATE IS THAT MANY OF THEM HAVE BETTER LUCK
_NOT_ USING TRANSMIT INTERRUPTS OR A TRANSMIT BUFFER.
┴LTHOUGH IT'S POSSIBLE TO ELIMINATE THE RECEIVE BUFFER ALSO, WE STRONGLY
ADVISE THAT YOU DON'T. ╘HE HOST COMPUTER, NOT YOUR PROGRAM, DECIDES WHEN
A NEW BYTE WILL ARRIVE. ╨OLLING THE ┴├╔┴ FOR RECEIVED BYTES INSTEAD OF
USING AN INTERRUPT-DRIVEN BUFFER JUST WASTE'S YOUR PROGRAM'S TIME AND
RISKS MISSING DATA.
╞OR A THOROUGH DISCUSSION OF THE USE OF BUFFERS, THE ╦ERNAL ╥╙-232 ROUTINES,
AND THE ├OMMODORE ╬═╔ HANDLER, SEE "├╧═╨╒╘┼!'S ╓╔├-20 AND ├OMMODORE 64 ╘OOL
╦IT: ╦ERNAL", BY ─AN ╚EEB (├╧═╨╒╘┼! ┬OOKS) AND "╫HAT'S ╥EALLY ╔NSIDE THE
├OMMODORE 64", BY ═ILTON ┬ATHURST (DISTRIBUTED IN THE ╒╙ BY ╙CHNEDLER
╙YSTEMS).
3. ┴├╔┴ ╥┼╟╔╙╘┼╥╙
╘HE FOUR ┴├╔┴ REGISTERS ARE EXPLAINED IN DETAIL IN THE ENCLOSED DATA SHEETS.
╘HE DEFAULT LOCATION FOR THEM IN OUR CARTRIDGE IS ADDRESS $─┼00--$─┼03
(56832--56836).
3.1. ─┴╘┴ ╥┼╟╔╙╘┼╥ ($─┼00)
╘HIS REGISTER HAS DUAL FUNCTIONALITY: IT IS USED TO RECEIVE AND TRANSMIT ALL
DATA BYTES (I.E., IT IS A READ/WRITE REGISTER).
─ATA RECEIVED BY THE ┴├╔┴ IS PLACED IN THIS REGISTER. ╔F RECEIVE INTERRUPTS
ARE ENABLED, AN INTERRUPT WILL BE GENERATED WHEN ALL BITS FOR A RECEIVED
BYTE HAVE BEEN ASSEMBLED AND THE BYTE IS READY TO READ.
╘RANSMIT INTERRUPTS, IF ENABLED, ARE GENERATED WHEN THIS REGISTER IS EMPTY
(AVAILABLE FOR TRANSMITTING). ┴ BYTE TO BE TRANSMITTED CAN BE PLACED IN THIS
REGISTER.
3.2. ╙╘┴╘╒╙ ╥┼╟╔╙╘┼╥ ($─┼01)
╘HIS REGISTER HAS DUAL FUNCTIONALITY: IT SHOWS THE VARIOUS ┴├╔┴ SETTINGS WHEN
READ, BUT WHEN WRITTEN TO (DATA = ANYTHING [I.E., DON'T CARE]), THIS REGISTER
TRIGGERS A RESET OF THE CHIP.
┴S THE ENCLOSED DATA SHEET SHOWS, THE ┴├╔┴ USES BITS IN THIS REGISTER TO
INDICATE DATA FLOW AND ERRORS.
╔F THE ┴├╔┴ GENERATES AN INTERRUPT, BIT #7 IS SET. ╘HERE ARE FOUR POSSIBLE
SOURCES OF INTERRUPTS:
1) RECEIVE (IF PROGRAMMED)
2) TRANSMIT (IF PROGRAMMED)
3) IF A CONNECTED DEVICE CHANGES THE STATE OF THE ─├─ LINE
4) IF A CONNECTED DEVICE CHANGES THE STATE OF THE ─╙╥ LINE
╙OME PROGRAMMERS HAVE REPORTED PROBLEMS WITH USING BIT #7 TO VERIFY ┴├╔┴
INTERRUPTS. ┴T 9600 BPS AND HIGHER, THE ┴├╔┴ GENERATES INTERRUPTS PROPERLY,
AND BITS #3--#6 (DESCRIBED BELOW) ARE SET TO REFLECT THE CAUSE OF THE
INTERRUPT, AS THEY SHOULD. ┬UT, BIT #7 IS NOT CONSISTENTLY SET. ┴T SPEEDS
UNDER 9600 BPS, BIT #7 SEEMS TO WORK AS DESIGNED. ╘O AVOID ANY DIFFICULTIES,
THE SAMPLE CODE BELOW IGNORES BIT #7 AND TESTS THE FOUR INTERRUPT SOURCE BITS
DIRECTLY.
┬IT #5 INDICATES THE STATUS OF THE ─╙╥ LINE CONNECTED TO THE ╥╙-232 DEVICE
(MODEM, PRINTER, ETC.), WHILE BIT #6 INDICATES THE STATUS OF THE ─├─ LINE.
╬╧╘┼: ╘HE FUNCTION OF THESE TWO BITS IS _REVERSED_ FROM THE STANDARD
IMPLEMENTATION. ╒NLIKE MANY ┴├╔┴S, THE 6551 WAS DESIGNED TO USE THE ─├─
(─ATA ├ARRIER ─ETECT) SIGNAL FROM THE MODEM TO ACTIVATE THE RECEIVER SECTION
OF THE CHIP. ╔F ─├─ IS INACTIVE (NO CARRIER DETECTED), THE MODEM MESSAGES
AND ECHOS OF COMMANDS WOULD NOT APPEAR ON THE USER'S SCREEN. ╫E WANTED THE
RECEIVER ACTIVE AT ALL TIMES. ╫E ALSO WANTED TO GIVE THE YOU ACCESS TO THE
─├─ SIGNAL FROM THE MODEM. ╙O, WE EXCHANGED THE ─├─ AND ─╙╥ SIGNALS AT THE
┴├╔┴. ┬OTH LINES ARE PULLED ACTIVE INTERNALLY BY THE CARTRIDGE IF LEFT
UNCONNECTED BY THE USER (I.E., IN AN NULL-MODEM CABLE POSSIBILITY).
┬IT #4 IS SET IF THE TRANSMIT REGISTER IS EMPTY. ┘OUR PROGRAM MUST MONITOR
THIS BIT AND NOT WRITE TO THE DATA REGISTER UNTIL THE BIT I SSET (SEE THE
SAMPLE ╪═╔╘ CODE BELOW).
┬IT #3 IS SET IF THE RECEIVE REGISTER IS FULL.
┬ITS #2, #1, AND #0, WHEN SET, INDICATE OVERRUN, FRAMING, AND PARITY ERRORS IN
RECEIVED BYTES. ╘HE NEXT DATA BYTE RECEIVED ERASES THE ERROR INFORMATION FOR
THE PRECEDING BYTE. ╔F YOU WISH TO USE THESE BITS, STORE THEM FOR PROCESSING
BY YOUR PROGRAM. ╘HE SAMPLE CODE BELOW DOES NOT IMPLEMENT ANY ERROR CHECKING,
BUT THE ╦ERNAL SOFTWARE ROUTINES DO, SO ADDING FEATURES TO YOUR CODE MIGHT BE
A GOOD IDEA.
3.3. ├╧══┴╬─ ╥┼╟╔╙╘┼╥ ($─┼02)
╘HE ├OMMAND ╥EGISTER CONTROL PARITY CHECKING, ECHO MODE, AND TRANSMIT/RECEIVE
INTERRUPTS. ╔T IS A READ/WRITE REGISTER, BUT READING THE REGISTER SIMPLY
TELLS YOU WHAT THE SETTINGS OF THE VARIOUS PARAMETERS ARE.
┘OU USE BITS #7, #6, AND #5 TO CHOOSE THE PARITY CHECKING DESIRED.
┬IT #4 SHOULD NORMALLY BE CLEARED (I.E., NO ECHO)
┬ITS #3 AND #2 SHOULD REFLECT WHETHER OR NOT YOU ARE USING TRANSMIT
INTERRUPTS, AND IF SO, WHAT KIND. ╔N THE FIRST SAMPLE TRANSMIT ROUTINE BELOW,
BIT #3 IS SET AND BIT #2 IS CLEARED TO DISABLE TRANSMIT INTERRUPTS (WITH ╥╘╙
LOW [ACTIVE]) ON STARTUP. ╚OWEVER, WHEN A BYTE IS PLACED IN THE TRANSMIT
BUFFER, BIT #3 IS CLEARED AND BIT #2 IS SET TO ENABLE TRANSMIT INTERRUPTS
(WITH ╥╘╙ LOW). ╫HEN ALL BYTES IN THE BUFFER HAVE BEEN TRANSMITTED, THE
INTERRUPT HANDLER DISABLES TRANSMIT INTERRUPTS. ╬╧╘┼: ╔F YOU ARE CONNECTED TO
A ╥╙-232 DEVICE THAT USES ├╘╙/╥╘╙ HANDSHAKING, YOU CAN TELL THE DEVICE TO STOP
TEMPORARILY BY BRINGING ╥╘╙ HIGH (INACTIVE): CLEAR BOTH BITS #2 AND #3.
┬IT #1 SHOULD REFLECT WHETHER OR NOT YOU ARE USING RECEIVE INTERRUPTS. ╔N
THE SAMPLE CODE BELOW, IT IS SET TO ENABLE RECEIVE INTERRUPTS.
┬IT #0 ACTS AS A "MASTER CONTROL SWITCH" FOR ALL INTERRUPTS ON THE CHIP
ITSELF. ╔T _MUST_ BE SET TO ENABLE ANY INTERRUPTS -- IF IT IS CLEARED, ALL
INTERRUPTS ARE TURNED OFF AND THE RECEIVER SECTION OF THE CHIP IS DISABLED.
╘HIS BIT ALSO PULLS THE ─╘╥ LINE LOW TO ENABLE COMMUNICATION WITH THE
CONNECTED ╥╙-232 DEVICE. ├LEARING THIS BIT CAUSES MOST ╚AYES-COMPATIBLE
MODEMS TO HANG UP (BY BRINGING ─╘╥ HIGH). ╘HIS BIT SHOULD BE CLEARED WHEN A
SESSION IS OVER AND THE USER EXITS THE TERMINAL PROGRAM TO INSURE THAT NO
SPURIOUS INTERRUPTS ARE GENERATED. ╧NE FAIRLY ELEGANT WAY TO DO THIS IS TO
PERFORM A SOFTWARE RESET OF THE CHIP (WRITING ANY VALUE TO THE ╙TATUS
REGISTER).
╬╧╘┼: ╔N THE FIGURES ON THE 6551 DATA SHEET, THERE ARE SMALL CHARTS AT THE
BOTTOM OF EACH OF THE LABELLED "╚ARDWARE ╥ESET/╨ROGRAM ╥ESET". ╘HESE CHARTS
INDICATE WHAT VALUES THE BITS OF THESE REGISTERS CONTAIN AFTER A HARDWARE
RESET (LIKE TOGGLING THE COMPUTER'S POWER) AND A PROGRAM RESET (A WRITE TO THE
╙TATUS REGISTER).
3.4. ├╧╬╘╥╧╠ ╥┼╟╔╙╘┼╥ ($─┼03)
┘OU USE THIS REGISTER TO CONTROL THE NUMBER OF STOP BITS, THE WORD LENGTH,
SWITCH ON THE INTERNAL BAUD-RATE GENERATOR, AND SET THE BAUD RATE. ╔T IS A
READ/WRITE REGISTER, BUT READING THE REGISTER SIMPLY TELLS YOU WHAT THE
VARIOUS PARAMETERS ARE. ╙EE THE FIGURE IN THE DATA SHEET FOR A COMPLETE LIST
OF PARAMETERS.
┬E SURE THAT BIT #4, THE "CLOCK SOURCE" BIT, IS ALWAYS SET TO USE THE ON-CHIP
CRYSTAL-CONTROLLED BAUD-RATE GENERATOR.
┘OU USE THE OTHER BITS TO CHOOSE THE BAUD RATE, WORD LENGTH, AND NUMBER OF
STOP BITS. ╬OTE THAT OUR CARTRIDGE USES A DOUBLE-SPEED CRYSTAL, SO VALUES
GIVEN ON THE DATA SHEET ARE DOUBLED [THIS IS HOW THEY ARE SHOWN BELOW] (THE
MINIMUM SPEED IS 100 BPS AND THE MAXIMUM SPEED IS 38,400 BPS).
4. ┴├╔┴ ╚┴╥─╫┴╥┼ ╔╬╘┼╥╞┴├╔╬╟
╘HE ┴├╔┴ IS MOUNTED ON A CIRCUIT BOARD DESIGNED TO PLUG INTO THE EXPANSION
(CARTRIDGE) PORT. ╘HE BOARD IS HOUSED IN A CARTRIDGE SHELL WITH A MALE ─┬-9
CONNECTOR AT THE REAR. ╘HE "╔┬═(╥) ╨├/┴╘(╘═) STANDARD" ─┬-9 ╥╙-232 PINOUT IS
IMPLEMENTED. ├OMMERCIAL ─┬-9 TO ─┬-25 PATCH CORDS ARE READILY AVAILABLE, AND
ARE SOLD BY US AS WELL.
┼IGHT OF THE NINE LINES FROM THE ┴╘ SERIAL PORT ARE IMPLEMENTED: ╘X─, ╥X─,
─╘╥, ─╙╥, ╥╘╙, ├╘╙, ─├─, & ╟╬─. ╥╔ (╥ING ╔NDICATOR) IS NOT IMPLEMENTED
BECAUSE THE 6551 DOES NOT HAVE A PIN TO HANDLE IT. ├╘╙ AND ╥╘╙ ARE NOT
NORMALLY USED BY 2400 BPS OR SLOWER ╚AYES-COMPATIBLE MODEMS, BUT THESE LINES
ARE BEING USED BY SEVERAL NEWER, FASTER MODEMS (═╬╨ MODEMS IN PARTICULAR).
╬OTE THAT ALTHOUGH ├╘╙ IS CONNECTED TO THE 6551, THERE IS NO WAY TO MONITOR
WHAT STATE IT IS -- THE VALUE DOES NOT APPEAR IN ANY REGISTER. ╘HE 6551
HANDLES ├╘╙ AUTOMATICALLY: IF IT IS PULLED HIGH (INACTIVE) BY THE CONNECTED
╥╙-232 DEVICE, THE 6551 STOPS TRANSMITTING (CLEARS THE "TRANSMIT DATA REGISTER
EMPTY" BIT [#4] IN THE STATUS REGISTER).
╘HE OUTPUT SIGNALS ARE STANDARD ╥╙-232 LEVEL COMPATIBLE. ╫E'VE TESTED UNITS
WITH SEVERAL COMMERCIAL MODEMS AND WITH VARIOUS COMPUTERS USING NULL-MODEM
CABLES UP TO 38,400 BPS WITHOUT DIFFICULTIES. ╔N ADDITION, THERE ARE PULL-UP
RESISTORS ON THREE OF THE FOUR INPUT LINES (─├─, ─╙╥, ├╘╙) SO THAT IF THESE
PINS ARE NOT CONNECTED IN A CABLE, THOSE THREE LINES WILL PULL TO THE ACTIVE
STATE. ╞OR EXAMPLE, IF YOU HAPPEN TO USE A CABLE THAT IS MISSING THE ─├─
LINE, THE PULL-UP RESISTOR WILL PULL THE LINE ACTIVE, SO THAT BIT #6 IN THE
STATUS REGISTER WOULD BE CLEARED (─├─ IS ACTIVE LOW).
┴N ON-BOARD CRYSTAL PROVIDES THE BAUD RATE CLOCK SIGNAL, WITH A MAXIMUM OF
38.4 ╦BAUD, BECAUSE WE ARE USING A DOUBLE-SPEED CRYSTAL. ╔F POSSIBLE, TEST
YOUR PROGRAM AT 38.4 ╦BAUD AS WELL AS LOWER BAUD RATES. ╒SERS MAY FIND THIS
HELPFUL FOR LOCAL FILE TRANSFERS USING THE ├-64/├-128 AS A DUMB TERMINAL ON
LARGER SYSTEMS. ┴ND, AFTER ALL, LOW-COST 28.8 ╦B MODEMS FOR THE MASSES ARE
JUST AROUND THE CORNER.
─EFAULT DECODING FOR THE ┴├╔┴ ADDRESSES IS DONE BY THE ╔/╧ #1 LINE (PIN 7) ON
THE CARTRIDGE PORT. ╘HIS LINE IS INFREQUENTLY USED ON EITHER THE ├-64 OR
├-128 AND SHOULD ALLOW COMPATIBILITY WITH MOST OTHER CARTRIDGE PRODUCTS,
INCLUDING THE ╥┼╒. ╘HE CIRCUIT BOARD ALSO HAS PADS FOR USERS WITH SPECIAL
NEEDS TO CHANGE THE DECODING TO ╔/╧ #2 (PIN 10). ╘HIS CHANGE MOVES THE ┴├╔┴
BASE ADDRESS TO $─╞00, MAKING IT INCOMPATIBLE WITH THE ╥┼╒.
├-128 USERS MAY ALSO ELECT TO DECODE THE ┴├╔┴ AT $─700 (THIS IS A ╙╔─-CHIP
MIRROR ON THE ├-64). ╙INCE A $─700 DECODING LINE IS NOT AVAILABLE AT THE
EXPANSION PORT, THE USER WOULD NEED TO RUN A CLIP LEAD INTO THE COMPUTER AND
CONNECT TO PIN 12 OF ╒2 (A 74╠╙138). ╫E HAVE TRIED THIS AND IT WORKS. $─700
IS AN ESPECIALLY ATTRACTIVE LOCATION FOR ├-128 ┬┬╙ AUTHORS, BECAUSE PUTTING
THE ╙WIFT╠INK THERE WILL FREE UP THE OTHER TWO MEMORY SLOTS FOR DEVICES THAT
MANY ┬┬╙ SYSOPS USE: ╔┼┼┼ AND HARD-DRIVE INTERFACES.
┴LTHOUGH WE ANTICIPATE RELATIVELY FEW PEOPLE CHANGING ┴├╔┴ DECODING, YOU
SHOULD ALLOW YOUR SOFTWARE TO WORK WITH A ╙WIFT╠INK AT ANY OF THE THREE
LOCATIONS. ┘OU COULD EITHER (1) TEST FOR THE ┴├╔┴ AUTOMATICALLY BY WRITING A
VALUE TO THE CONTROL REGISTER AND THEN ATTEMPTING TO READ IT BACK OR (2)
PROVIDE A USER-CONFIGURABLE SWITCH/POKE/MENU OPTION.
╘HE ┌80 ├╨╒ USED FOR ├╨/═ MODE IN THE ├-128 IS NOT CONNECTED TO THE ╬═╔ LINE,
WHICH POSES A PROBLEM SINCE THE CLEANEST SOFTWARE INTERFACE FOR ├-64/├-128-
MODE PROGRAMMING IS WITH THIS INTERRUPT. ╫E HAVE ADDED A SWITCH TO ALLOW THE
┴├╔┴ INTERRUPT TO BE CONNECTED TO EITHER ╬═╔ OR ╔╥╤, WHICH THE ┌80 DOES USE.
╘HE USER CAN MOVE THIS SWITCH WITHOUT OPENING THE CARTRIDGE.
5. ╙┴═╨╠┼ ├╧─┼
╘HIS SECTION HAS BEEN TRANSLATED INTO ┴├┼-ASSEMBLER FORMAT. ├UT ON THE DOTTED
LINES TO EXTRACT THE CODE, AND ASSEMBLE IT USING THE ┴├┼ ASSEMBLER (┴├┼ IS A
PUBLIC-DOMAIN PROGRAM). ╘HIS PROGRAM WILL WORK ON BOTH THE ├64 AND ├128.
╘O USE FROM ┬┴╙╔├:
╠╧┴─"╙┴═╨╠┼",8,1
╙┘╙8192
╔T IS A VERY SIMPLE TERMINAL PROGRAM. ╨RESS THE ╙╘╧╨ KEY TO EXIT FROM IT.
%%%---8<---CUT-HERE---8<---%%%
;╙AMPLE ╬═╔ INTERRUPT HANDLER FOR 6551 ┴├╔┴ ON ├OMMODORE 64/128
;(C) 1990 BY ╬OEL ╬YMAN, ╦ENT ╙ULLIVAN, ┬RIAN ═INUGH,
;╟EODUCK ─EVELOPMENT ╙YSTEMS, AND ─R. ┼VIL ╠ABS.
; ---=== ┼╤╒┴╘┼╙ ===---
BASE = $─┼00 ;BASE ┴├╔┴ ADDRESS
DATA = BASE
STATUS = BASE+1
COMMAND = BASE+2
CONTROL = BASE+3
;╒SING THE ┴├╔┴ FREES MANY ADDRESSES IN ZERO PAGE NORMALLY USED BY
;╦ERNEL ╥╙-232 ROUTINES. ╘HE ADDRESSES FOR THE BUFFER POINTERS WERE
;CHOSEN ARBITRARILY. ╘HE BUFFER VECTOR ADDRESSES ARE THOSE USED BY
;THE ╦ERNAL ROUTINES.
RHEAD = $┴7 ;POINTER TO NEXT BYTE TO BE REMOVED FROM
;RECEIVE BUFFER
RTAIL = $┴8 ;POINTER TO LOCATION TO STORE NEXT BYTE RECEIVED
RBUFF = $╞7 ;RECEIVE-BUFFER VECTOR
THEAD = $┴9 ;POINTER TO NEXT BYTE TO BE REMOVED FROM
;TRANSMIT BUFFER
TTAIL = $┴┴ ;POINTER TO LOCATION TO STORE NEXT BYTE
;IN TRANSMIT BUFFER
TBUFF = $╞9 ;TRANSMIT BUFFER
XMITCOUNT = $┴┬ ;COUNT OF BYTES REMAINING IN TRANSMIT (XMIT) BUFFER
RECVCOUNT = $┬4 ;COUNT OF BYTES REMAINING IN RECEIVE BUFFER
ERRORS = $┬5 ;─╙╥, ─├─, AND RECEIVED DATA ERRORS INFORMATION
XMITON = $┬6 ;STORAGE LOCATION FOR MODEL OF COMMAND REGISTER
;WHICH TURN BOTH RECEIVE AND TRANSMIT INTERRUPTS ON
XMITOFF = $┬─ ;STORAGE LOCATION FOR MODEL OF COMMAND REGISTER
;WHICH TURNS THE RECEIVE INTERRUPT ON AND THE
;TRANSMIT INTERRUPTS OFF
╬═╔╬╓ = $0318 ;├OMMODORE ╬ON-═ASKABLE ╔NTERRUPT VECTOR
╧╠─╓┼├ = $03FE ;INNOCUOUS LOCATION TO STORE OLD ╬═╔ VECTOR (TWO BYTES)
; ---=== ╔╬╔╘╔┴╠╔┌┴╘╔╧╬ ===---
;├ALL THE FOLLOWING CODE AS PART OF SYSTEM INITIALIZATION.
;CLEAR ALL BUFFER POINTERS, BUFFER COUNTERS, AND ERRORS LOCATION
ORG $2000 ;CHANGE TO SUIT YOUR NEEDS
LDA #$00
STA RHEAD
STA RTAIL
STA THEAD
STA TTAIL
STA XMITCOUNT
STA RECVCOUNT
STA ERRORS
;STORE THE ADDRESSES OF THE BUFFERS IN THE ZERO-PAGE VECTORS
LDA #<╘╥┴╬╙═╔╘_┬╒╞╞┼╥
STA TBUFF
LDA #>╘╥┴╬╙═╔╘_┬╒╞╞┼╥
STA TBUFF + 1
LDA #<╥┼├┼╔╓┼_┬╒╞╞┼╥
STA RBUFF
LDA #>╥┼├┼╔╓┼_┬╒╞╞┼╥
STA RBUFF + 1
;THE NEXT FOUR INSTRUCTIONS INITIALIZE THE ┴├╔┴ TO ARBITRARY VALUES.
;╘HESE COULD BE PROGRAM DEFAULTS, OR REPLACED BY CODE THAT PICKS UP
;THE USER'S REQUIREMENTS FOR BAUD RATE, PARITY, ETC.
;╘HE ┴├╔┴ "CONTROL" REGISTER CONTROLS STOP BITS, WORD LENGTH, THE
;CHOICE OF INTERNAL OR EXTERNAL BAUD-RATE GENERATOR, AND THE BAUD
;RATE WHEN THE INTERNAL GENERATOR IS USED. ╘HE VALUE BELOW SETS THE
;┴├╔┴ FOR ONE STOP BIT, EIGHT-BIT WORD LENGTH, AND 4800 BAUD USING THE
;INTERNAL GENERATOR.
; .------------------------- 0 = ONE STOP BIT
; :
; :.-------------------- WORD LENGTH, BITS 6-7
; ::.------------------- 00 = EIGHT-BIT WORD
; :::
; :::.------------- CLOCK SOURCE, 1 = INTERNAL GENERATOR
; ::::
; :::: .----- BAUD
; :::: :.---- RATE
; :::: ::.--- BITS ;1010 == 4800 BAUD, CHANGE TO WHAT YOU WANT
; :::: :::.-- 0-3
LDA #%0001_1010
STA CONTROL
;╘HE ┴├╔┴ "COMMAND" REGISTER CONTROLS THE PARITY, ECHO MODE, TRANSMIT AND
;RECEIVE INTERRUPT ENABLING, HARDWARE "┬╥╦", AND (INDIRECTLY) THE "╥╘╙"
;AND "─╘╥" LINES. ╘HE VALUE BELOW SETS THE ┴├╔┴ FOR NO PARITY CHECK,
;NO ECHO, DISABLES TRANSMIT INTERRUPTS, AND ENABLES RECEIVE INTERRUPTS
;(╥╘╙ AND ─╘╥ LOW).
; .------------------------- PARITY CONTROL,
; :.------------------------ BITS 5-7
; ::.----------------------- 000 = NO PARITY
; :::
; :::.------------------- ECHO MODE, 0 = NORMAL (NO ECHO)
; ::::
; :::: .----------- TRANSMIT INTERRUPT CONTROL, BITS 2-3
; :::: :.---------- 10 = XMIT INTERRUPT OFF, ╥╘╙ LOW
; :::: ::
; :::: ::.------ RECEIVE INTERRUPT CONTROL, 0 = ENABLED
; :::: :::
; :::: :::.--- ─╘╥ CONTROL, 1=─╘╥ LOW
LDA #%0000_1001
STA COMMAND
;┬ESIDES INITIALIZATION, ALSO CALL THE FOLLOWING CODE WHENEVER THE USER
;CHANGES PARITY OF ECHO MODE.
;╔T CREATES THE "XMITOFF" AND "XMITON" MODELS USED BY THE INTERRUPT
;HANDLER AND MAIN-PROGRAM TRANSMIT ROUTINE TO CONTROL THE ┴├╔┴
;INTERRUPT ENABLING. ╔F YOU DON'T CHANGE THE MODELS' PARITY BITS,
;YOU'LL REVERT TO "DEFAULT" PARITY ON THE NEXT ╬═╔.
;INITIALIZE WITH TRANSMIT INTERRUPTS OFF SINCE
;BUFFER WILL BE EMPTY
STA XMITOFF ;STORE AS A MODEL FOR FUTURE USE
AND #%1111_0000 ;MASK OFF INTERRUPT BITS, KEEP PARITY/ECHO BITS
ORA #%0000_0101 ;AND SET BITS TO ENABLE BOTH TRANSMIT AND
;RECEIVE INTERRUPTS
STA XMITON ;STORE ALSO FOR FUTURE USE
;╘HE STANDARD ╬═╔ ROUTINE TESTS TH <╥┼╙╘╧╥┼> KEY, ├╔┴ #2, AND CHECKS
;FOR THE PRESENCE OF AN AUTOSTART CARTRIDGE.
;┘OU CAN SAFELY BYPASS THE NORMAL ROUTINE UNLESS:
; * YOU WANT TO KEEP THE USER PORT ACTIVE
; * YOU WANT TO USE THE ╘╧─ CLOCK IN ├╔┴ #2
; * YOU WANT TO DETECT AN AUTOSTART CARTRIDGE
; * YOU WANT TO DETECT THE ╥┼╙╘╧╥ KEY
;
;╔F YOU NEED ANY OF THESE FUNCTIONS, YOU CAN WEDGE THE ┴├╔┴
;INTERRUPT HANDLER IN AHEAD OF THE ╦ERNAL ROUTINES. ╔T'S PROBABLY
;SAFER TO REPLICATE IN YOUR OWN PROGRAM ONLY THE ╦ERNAL ╬═╔ FUNCTIONS
;THAT YOU NEED. ╫E'LL ILLUSTRATE BYPASSING ALL ╦ERNAL TESTS.
;┬┼ ╙╒╥┼ ╘╚┼ "╬┼╫╬═╔" ╥╧╒╘╔╬┼ ╔╙ ╔╬ ╨╠┴├┼ ┬┼╞╧╥┼ ┼╪╔╘╔╬╟ ╘╚╔╙ ├╧─┼!
;┴ "STRAY" ╬═╔ THAT OCCURS AFTER THE VECTOR IS CHANGED TO ╬┼╫╬═╔'S ADDRESS
;WILL PROBABLY CAUSE A SYSTEM CRASH IF ╬┼╫╬═╔ ISN'T THERE. ┴LSO, IT WOULD
;BE BEST TO INITIALIZE THE ┴├╔┴ TO A "NO INTERRUPTS" STATE UNTIL THE
;NEW VECTOR IS STORED. ┴LTHOUGH A POWER-ON RESET SHOULD DISABLE ALL
;┴├╔┴ INTERRUPTS, IT PAYS TO BE SURE.
;╔F THE USER TURNS THE MODEM OFF AND ON, AN INTERRUPT WILL PROBABLY BE
;GENERATED. ┴T WORST, THIS MAY LEAVE A STRAY CHARACTER IN TEH RECEIVE
;BUFFER, UNLESS YOU DON'T HAVE ╬┼╫╬═╔ IN PLACE.
╬┼╫╓┼├:
SEI ;┴ STRAY ╔╥╤ SHOULDN'T CAUSE ANY PROBLEMS
;WHILE WE'RE CHANGING THE ╬═╔ VECTOR, BUT
;WHY TAKE CHANCES?
;╔F YOU WANT ALL THE NORMAL ╬═╔ TESTS TO OCCUR AFTER THE ┴├╔┴ CHECK,
;SAVE THE OLD VECTOR. ╔F YOU DON'T NEED THE REGULAR STUFF, YOU CAN
;SKIP THE NEXT FOUR LINES. ╬OTE THAT THE ╦ERNAL ╬═╔ ROUTINE PUSHES
;THE ├╨╒ REGISTERS TO THE STACK. ╔F YOU CALL IT AT THE NORMAL ADDRESS,
;YOU SHOULD POP THE REGISTERS FIRST (SEE ┼╪╔╘╔╬╘ BELOW).
LDA ╬═╔╬╓ ;GET LOW BYTE OF PRESENT VECTOR
STA ╧╠─╓┼├ ;AND STORE IT FOR FUTURE USE
LDA ╬═╔╬╓+1 ;DO THE SAME
STA ╧╠─╓┼├+1 ;WITH THE HIGH BYTE
;COME HERE FROM THE ╙┼╔ IF YOU'RE NOT SAVING
;THE OLD VECTOR
LDA #<╬┼╫╬═╔ ;GET LOW BYTE OF NEW ╬═╔ ROUTINE
STA ╬═╔╬╓ ;STORE IN VECTOR
LDA #>╬┼╫╬═╔ ;AND DO THE SAME WITH
STA ╬═╔╬╓+1 ;THE HIGH BYTE
CLI ;ALLOW ╔╥╤S AGAIN
;CONTINUE INITIALIZING YOUR PROGRAM
; ::: :::::: ;PROGRAM INITIALIZATION CONTINUES
JMP ╘┼╥═╔╬┴╠ ;GO TO THE EXAMPLE DUMB-TERMINAL SUBROUTINE
;╙AVE TWO BYTES TO STORE THE OLD VECTOR ONLY IF YOU NEED IT
; ---=== ╬EW ╬═╔ ╥OUTINE ╙TARTS ╚ERE ===---
;╘HE CODE BELOW IS A SIMPLE INTERRUPT PATCH TO CONTROL THE ┴├╔┴. ╫HEN
;THE ┴├╔┴ GENERATES AN INTERRUPT, THIS ROUTINE EXAMINES THE STATUS
;REGISTER WHICH CONTAINS THE FOLLOWING DATA.
; .---------------------------- HIGH IF ┴├╔┴ CAUSED INTERRUPT;
; : NOT USED IN CODE BELOW
; :
; :.------------------------- REFLECTS STATE OF ─├─ LINE
; ::
; ::.---------------------- REFLECTS STATE OF ─╙╥ LINE
; :::
; :::.------------------ HIGH IF XMIT-DATA REGISTER IS EMPTY
; ::::
; :::: .--------------- HIGH IF RECEIVE-DATA REGISTER FULL
; :::: :
; :::: :.----------- HIGH IF OVERRUN ERROR
; :::: ::
; :::: ::.------- HIGH IF FRAMING ERROR
; :::: :::
; :::: :::.--- HIGH IF PARITY ERROR
; STATUS XXXX_XXXX
╬┼╫╬═╔:
; SEI ;THE ╦ERNAL ROUTINE ALREADY DOES THIS BEFORE JUMPING
;THROUGH THE ╬═╔╬╓ VECTOR
PHA ;SAVE ┴ REGISTER
TXA
PHA ;SAVE ╪ REGISTER
TYA
PHA ;SAVE ┘ REGISTER
;┴S DISCUSSED ABOVE, THE ┴├╔┴ CAN GENERATE AN INTERRUPT FROM ONE OF FOUR
;DIFFERENT SOURCES. ╫E'LL FIRST CHECK TO SEE IF THE INTERRUPT WAS
;CAUSED BY THE RECEIVE REGISTER BEING FULL (BIT #3) OR THE TRANSMIT
;REGISTER BEING EMPTY (BIT #4) SINCE THESE TWO ACTIVITIES SHOULD RECEIVE
;PRIORITY. ┴ ┬┼╤ (┬RANCH IF ┼╤UAL) TESTS THE STATUS REGISTER AND BRANCHES
;IF THE INTERRUPT WAS NOT CAUSED BY THE DATA REGISTER.
;┬EFORE TESTING FOR THE SOURCE OF THE INTERRUPT, WE'LL PREVENT MORE
;INTERRUPTS FROM THE ┴├╔┴ BY DISABLING THEM AT THE CHIP. ╘HIS PREVENTS
;ANOTHER ╬═╔ FROM INTERRUPTING THIS ONE. (╙┼╔ WON'T WORK BECAUSE THE
;├╨╒ CAN'T DISABLE NON-MASKABLE INTERRUPTS).
;┴T LOWER BAUD RATES (2400 BAUD AND LOWER) THIS MAY NOT BE NECESSARY. ┬UT,
;IT'S SAFE AND DOESN'T TAKE MUCH TIME, EITHER.
;╘HE SAME TECHNIQUE SHOULD BE USED IN PARTS OF YOUR PROGRAM WHERE TIMING
;IS CRITICAL. ─ISK ACCESS, FOR EXAMPLE, USES ╙┼╔ TO MASK ╔╥╤ INTERRUPTS.
;┘OU SHOULD TURN OFF THE ┴├╔┴ INTERRUPTS DURING DISK ACCESS ALSO TO PREVENT
;DISK ERRORS AND SYSTEM CRASHES.
;╞IRST, WE'LL LOAD THE STATUS REGISTER WHICH CONTAINS ALL THE INTERRUPT
;AND ANY RECEIVED-DATA ERROR INFORMATION IN THE '┴' REGISTER.
LDA STATUS
;╬OW PREVENT ANY MORE ╬═╔S FROM THE ┴├╔┴
LDX #%0000_0011 ;DISABLE ALL INTERRUPTS, BRING ╥╘╙ INACTIVE, AND
;LEAVE ─╘╥ ACTIVE
STX COMMAND ;SEND TO ┴├╔┴-- CODE AT END OF INTERRUPT HANDLER
;WILL RE-ENABLE INTERRUPTS
;╙TORE THE STATUS-REGISTER DATA ONLY IF NEEDED FOR ERROR CHECKING.
;╘HE NEXT RECEIVED BYTE WILL CLEAR THE ERROR FLAGS.
; STA ERRORS ;ONLY IF ERROR CHECKING IMPLEMENTED
AND #%0001_1000 ;MASK OUT ALL BUT TRANSMIT AND
;RECEIVE INTERRUPT INDICATORS
;╔F YOU DON'T USE A TRANSMIT BUFFER YOU CAN USE
;
; AND #%0000_1000
;
;TO TEST FOR RECEIVE INTERRUPTS ONLY AND SKIP THE RECEIVE TEST SHOWN
;BELOW.
BEQ ╘┼╙╘_─├─_─╙╥
;IF THE '┴' REGISTER=0, EITHER THE INTERRUPT WAS NOT CAUSED BY THE
;┴├╔┴ OR THE ┴├╔┴ INTERRUPT WAS CAUSED BY A CHANGE IN THE ─├─ OR
;─╙╥ LINES, SO WE'LL BRANCH TO CHECK THOSE SOURCES.
;╔F YOUR PROGRAM IGNORES ─├─ AND ─╙╥, YOU CAN BRANCH TO
;THE END OF THE INTERRUPT HANDLER INSTEAD:
;
; BEQ ╬═╔┼╪╔╘
;
;╘EST THE STATUS REGISTER INFORMATION TO SEE IF A RECEIVED BYTE IS READY
;╔F YOU DON'T USE A TRANSMIT BUFFER, SKIP THE NEXT TWO INSTRUCTIONS.
╥┼├┼╔╓┼: ;PROCESS RECEIVED BYTE
AND #%0000_1000 ;MASK ALL BUT BIT #3
BEQ ╪═╔╘├╚┴╥ ;IF NOT SET, NO RECEIVED BYTE - IF YOU'RE USING
;A TRANSMIT BUFFER, THE INTERRUPT MUST HAVE BEEN
;CAUSED BY TRANSMIT. ╙O, BRANCH TO HANDLE.
LDA DATA ;GET RECEIVED BYTE
LDY RTAIL ;INDEX TO BUFFER
STA (RBUFF),Y ;AND STORE IT
INC RTAIL ;MOVE INDEX TO NEXT SLOT
INC RECVCOUNT ;INCREMENT COUNT OF BYTES IN RECEIVE BUFFER
;(IF USED BY YOUR PROGRAM)
;╙KIP THE "╪═╔╘" ROUTINES BELOW IF YOU DECIDE NOT TO USE A TRANSMIT BUFFER.
;╔N THAT CASE, THE NEXT CODE EXECUTED STARTS AT ╘┼╙╘_─├─_─╙╥ OR ╬═╔┼╪╔╘.
;┴FTER PROCESSING A RECEIVED BYTE, THIS SAMPLE CODE TESTS FOR BYTES
;IN THE TRANSMIT BUFFER AND SENDS ON IF PRESENT. ╬OTE THAT, IN THIS
;SAMPLE, RECEIVE INTERRUPTS TAKE PRECEDENCE. ┘OU MAY WANT TO REVERSE THE
;ORDER IN YOUR PROGRAM.
;╔F THE ┴├╔┴ GENERATED A TRANSMIT INTERRUPT AND NO RECEIVED BYTE WAS
;READY, STATUS BIT #4 IS ALREADY SET. ╘HE ┴├╔┴ IS READY TO ACCEPT
;THE BYTE TO BE TRANSMITTED AND WE'VE BRANCHED DIRECTLY TO ╪═╔╘├╚┴╥ BELOW.
;╔F ONLY BIT #3 WAS SET ON ENTRY TO THE INTERRUPT HANDLER, THE ┴├╔┴ MAY HAVE
;BEEN IN THE PROCESS OF TRANSMITTING THE LAST BYTE, AND THERE MAY STILL BE
;CHARACTERS IN THE TRANSMIT BUFFER. ╫E'LL CHECK FOR THAT NOW, AND SEND THE
;NEXT CHARACTER IF THERE IS ONE. ┬EFORE SENDING A CHARACTER TO THE ┴├╔┴ TO
;BE TRANSMITTED, WE MUST WAIT UNTIL BIT #4 OF THE STATUS REGISTER IS SET.
╪═╔╘:
LDA XMITCOUNT ;IF NOT ZERO, CHARACTERS STILL IN BUFFER
;FALL THROUGH TO PROCESS XMIT BUFFER
BEQ ╘┼╙╘_─├─_─╙╥ ;NO CHARACTERS IN BUFFER-- GO TO NEXT CHECK
;OR
;
; BEQ ╬═╔┼╪╔╘
;
;IF YOU DON'T CHECK ─├─ OR ─╙╥ IN YOUR PROGRAM.
╪═╔╘┬┘╘┼:
LDA STATUS ;TEST BIT #4
AND #%00010000
BEQ ╘┼╙╘_─├─_─╙╥ ;SKIP IF TRANSMITTER STILL BUSY
╪═╔╘├╚┴╥: ;TRANSMIT A CHARACTER
LDY THEAD
LDA (TBUFF),Y ;GET CHARACTER AT HEAD OF BUFFER
STA DATA ;PLACE IN ┴├╔┴ FOR TRANSMIT
;POINT TO NEXT CHARACTER IN BUFFER
INC THEAD ;AND STORE NEW INDEX
DEC XMITCOUNT ;SUBTRACT ONE FROM COUNT OF BYTES
;IN XMIT BUFFER
LDA XMITCOUNT
BEQ ╘┼╙╘_─├─_─╙╥
;OR
;
; BEQ ╬═╔┼╪╔╘
;
;IF YOU DON'T CHECK ─├─ OR ─╙╥ IN YOUR PROGRAM
;╔F XMITCOUNT DECREMENTS TO ZERO, THERE ARE NO MORE CHARACTERS TO
;TRANSMIT. ╘HE CODE AT ╬═╔┼╪╔╘ TURNS ┴├╔┴ TRANSMIT INTERRUPTS OFF.
;╔F THERE ARE MORE BYTES IN THE BUFFER, SET UP THE '┴' REGISTER WITH
;THE MODEL THAT TURNS BOTH TRANSMIT AND RECEIVE INTERRUPTS ON. ╫E FELT
;THAT WAS SAFER, AND NOT MUCH SLOWER, THAN ┼╧╥ING BITS #3 AND #4. ╬OTE
;THAT THE STATUS OF THE PARITY/ECHO BITS IS PRESERVED IN THE WAY "XMITON"
;AND "XMITOFF" WERE INITIALIZED EARLIER.
LDA XMITON ;MODEL TO LEAVE BOTH INTERRUPTS ENABLED
;╔F YOU DON'T USE ─├─ OR ─╙╥
BNE ╬═╔├╧══┴╬─ ;BRANCH ALWAYS TO STORE MODEL IN COMMAND REGISTER
;╔F YOUR PROGRAM USES ─├─ AND/OR ─╙╥, YOU'LL WANT TO KNOW WHEN THE STATE
;OF THOSE LINES CHANGES. ┘OU CAN DO THAT OUTSIDE THE INTERRUPT HANDLER
;BY POLLING THE ┴├╔┴ STATUS REGISTER, BUT IF EITHER OF THE LINES CHANGES,
;THE CHIP WILL GENERATE AN ╬═╔ ANYWAY. ╙O, YOU CAN LET THE INTERRUPT
;HANDLER DO TEH WORK FOR YOU. ╘HE COST IS THE ADDED TIME REQUIRED TO
;EXECUTE THE ─├─_─╙╥ CODE ON EACH ╬═╔.
╘┼╙╘_─├─_─╙╥:
; PHA ;ONLY IF YOU USE A TRANSMIT BUFFER, '┴' HOLDS
;THE PROPER MASK TO RE-ENABLE INTERRUPTS ON
;THE ┴├╔┴
; ::
; :: ;APPROPRIATE CODE HERE TO COMPARE BIT #6 (─├─)
; :: ;AND/OR BIT #5 (─╙╥) WITH THEIR PREVIOUS STATES
; :: ;WHICH YOU'VE ALREADY STORED IN MEMORY AND TAKE
; :: ;APPROPRIATE ACTION
; ::
; PLA ;ONLY IF YOU PUSHED IT AT THE START OF THE
;─├─/─╙╥ ROUTINE
; BNE ╬═╔├╧══┴╬─ ;'┴' HOLDS THE XMITON MASK IF IT'S NOT ZERO,
;IMPLYING THAT WE ARRIVED HERE FROM XMIT ROUTINE
;NOT USED IF YOU'RE NOT USING A TRANSMIT BUFFER.
;╔F THE TEST FOR ┴├╔┴ INTERRUPT FAILED ON ENTRY TO THE HANDLER, WE BRANCH
;DIRECTLY TO HERE. ╔F YOU DON'T USE ADDITIONAL HANDLERS, THE ╥┼╙╘╧╥┼ KEY
;(FOR EXAMPLE) WILL FALL THROUGH HERE AND HAVE NO EFFECT ON YOUR PROGRAM
;OR THE MACHINE, EXCEPT FOR SOME WASTED CYCLES.
╬═╔┼╪╔╘:
LDA XMITOFF ;LOAD MODEL TO TURN TRANSMIT INTERRUPTS OFF
;AND THIS LINE SETS THE INTERRUPT STATUS TO WHATEVER IS IN THE '┴' REGISTER.
╬═╔├╧══┴╬─:
STA COMMAND
;╘HAT'S ALL WE NEED FOR THE ┴├╔┴ INTERRUPT HANDLER. ╙INCE WE'VE PUSHED THE
;├╨╒ REGISTERS TO THE STACK, WE NEED TO POP THEM OFF. ╬OTE THAT YOU MUST
;DO THIS ┼╓┼╬ ╔╞ ┘╧╒ ╩╒═╨ ╘╧ ╘╚┼ ╦┼╥╬┴╠ ╚┴╬─╠┼╥ ╬┼╪╘, SINCE IT WILL PUSH
;THEM AGAIN IMMEDIATELY. ┘OU CAN SKIP THIS STEP ONLY IF YOU'RE PROCEEDING
;TO A CUSTOM HANDLER.
┼╪╔╘╔╬╘: ;RESTORE THINGS AND EXIT
PLA ;RESTORE '┘' REGISTER
TAY
PLA ;RESTORE '╪' REGISTER
TAX
PLA ;RESTORE '┴' REGISTER
;╔F YOU WANT TO CONTINUE PROCESSING THE INTERRUPT WITH THE ╦ERNAL ROUTINES,
JMP (╧╠─╓┼├) ;CONTINUE PROCESSING INTERRUPT WITH ╦ERNAL HANDLER
;╧R, IF YOU ADD YOUR OWN INTERRUPT ROUTINE,
; JMP ┘╧╒╥├╧─┼ ;CONTINUE WITH YOUR OWN HANDLER
;╔F YOU USE YOUR OWN ROUTINE, OR IF YOU DON'T ADD ANYTHING, ┬┼ ╙╒╥┼ TO DO
;THIS LAST (├64 ONLY):
; RTI ;RETURN FROM INTERRUPT INSTRUCTION
;TO RESTORE THE FLAGS REGISTER THE ├╨╒ PUSHES TO THE STACK BEFORE JUMPING
;TO THE ╦ERNAL CODE. ╔T ALSO RETURNS YOU TO THE INTERRUPTED PART OF
;YOUR PROGRAM
;-----------------------------------------------------------------------------
;╙AMPLE ROUTINE TO STORE A CHARACTER IN THE BUFFER TO BE TRANSMITTED
;BY THE ┴├╔┴.
;(C) 1990 BY ╬OEL ╬YMAN, ╦ENT ╙ULLIVAN, ┬RIAN ═INUGH,
;╟EODUCK ─EVELOPMENTAL ╙YSTEMS, AND ─R. ┼VIL ╠ABS.
;┴SSUMES THE CHARACTER IS IN THE '┴' REGISTER ON ENTRY. ─ESTROYS '┘'--
;PUSH TO STACK IF YOU NEED TO PRESERVE IT.
╙┼╬─┬┘╘┼: ;ADDS A BYTE TO THE XMIT BUFFER AND SETS
;THE ┴├╔┴ TO ENABLE TRANSMIT INTERRUPTS (THE
;INTERRUPT HANDLER WILL DISABLE THEM AGAIN
;WHEN THE BUFFER IS EMPTY)
LDY XMITCOUNT ;COUNT OF BYTES IN TRANSMIT BUFFER
CPY #255 ;MAX BUFFER SIZE
BEQ ╬╧╘╚╔╬╟ ;BUFFER IS FULL, DON'T ADD BYTE
LDY TTAIL ;POINTER TO END OF BUFFER
STA (TBUFF),Y ;STORE BYTE IN '┴' AT END OF BUFFER
INC TTAIL ;POINT TO NEXT SLOT IN BUFFER
INC XMITCOUNT ;AND ADD ONE TO COUNT OF BYTES IN BUFFER
LDA XMITON ;GET MODEL FOR TURNING ON TRANSMIT INTERRUPTS
STA COMMAND ;TELL ┴├╔┴ TO DO IT
RTS ;RETURN TO YOUR PROGRAM
╬╧╘╚╔╬╟:
LDA #$00 ;OR WHATEVER FLAG YOUR PROGRAM USES TO TELL THAT THE
;BYTE WAS NOT TRANSMITTED
RTS ;AND RETURN
;┴LTERNATIVE ROUTINE TO TRANSMIT A CHARACTER FROM MAIN PROGRAM WHEN NOT USING
;A TRANSMIT BUFFER.
;
;(C) 1990 BY ╬OEL ╬YMAN, ╦ENT ╙ULLIVAN, ┬RIAN ═INUGH,
;╟EODUCK ─EVELOPMENTAL ╙YSTEMS, AND ─R. ┼VIL ╠ABS.
;
;┴SSUMES THE CHARACTER TO BE TRANSMITTED IS IN THE '┴' REGISTER ON ENTRY.
;─ESTROYS '┘'; PUSH TO STACK IF YOU NEED TO PRESERVE IT.
;
;╙┼╬─┬┘╘┼:
; TAY ;REMEMBER BYTE TO BE TRANSMITTED
;
;╘┼╙╘┴├╔┴:
; LDA STATUS ;BIT #4 OF THE STATUS REGISTER IS SET IF
; ;THE ┴├╔┴ IS READY TO TRANSMIT ANOTHER BYTE,
; ;EVEN IF TRANSMIT INTERRUPTS ARE DISABLED.
; AND #%0001_0000
; BEQ ╘┼╙╘┴├╔┴ ;WAIT FOR BIT #4 TO BE SET
; STY DATA ;GIVE BYTE TO ┴├╔┴
; RTS
;╙AMPLE ROUTINE TO FETCH A CHARACTER THAT HAS BEEN RECEIVED, FROM THE
;RECEIVE BUFFER.
;BY ├RAIG ┬RUCE, 1995, ADAPTED FROM ABOVE
;╫ILL RETURN THE CHARACTER IN THE '┴' REGISTER AND THE CARRY FLAG CLEARED IF
;A CHARACTER WAS AVAILABLE. ╔F NO CHARACTER WAS AVAILABLE, WILL RETURN WITH
;THE CARRY FLAG SET. ─ESTROYS THE '┘' REGISTER.
╥┼├╓┬┘╘┼: ;FETCHES A BYTE FROM THE RECEIVE BUFFER.
;THERE IS NO NEED TO FIDDLE WITH ANY INTERRUPTS
LDA RECVCOUNT ;COUNT OF BYTES IN RECEIVE BUFFER
BEQ ╥┼├╓┼═╨╘┘ ;BUFFER IS EMPTY, INDICATE TO CALLER
LDY RHEAD ;POINTER TO START OF BUFFER
LDA (RBUFF),Y ;FETCH BYTE OUT OF BUFFER INTO '┴' REGISTER
INC RHEAD ;POINT TO NEXT SLOT IN BUFFER
DEC RECVCOUNT ;AND ADD ONE TO COUNT OF BYTES IN BUFFER
CLC ;INDICATE THAT WE HAVE A CHARACTER
RTS ;RETURN TO YOUR PROGRAM
╥┼├╓┼═╨╘┘:
SEC ;OR WHATEVER FLAG YOUR PROGRAM USES TO TELL THAT THE
;RECEIVE BUFFER WAS EMPTY
RTS ;AND RETURN
;-----------------------------------------------------------------------------
;─UMB -- VERY DUMB -- TERMINAL EMULATOR. ╙IMPLY POLLS THE RECEIVE BUFFER AND
;THE KEYBOARD AND PUTS RECEIVED DATA TO THE SCREEN AND TYPED DATA TO THE SEND
;BUFFER (THUS, IT ASSUMES A FULL-DUPLEX, ECHOING LINK). ╘HERE IS NO
;╨┼╘╙├╔╔->┴╙├╔╔ CONVERSION, NO CURSOR, NOR ANY OTHER FANCY FEATURES. ╨RESS
;╙╘╧╨ TO EXIT.
;
;BY ├RAIG ┬RUCE, 1995.
╘┼╥═╔╬┴╠:
JSR ╥┼├╓┬┘╘┼ ;SEE IF THERE IS A RECEIVED BYTE IN THE RECV BUFFER
BCS ╘┼╥═╘╥┘╙┼╬─ ;IF NOT, CONTINUE
JSR $╞╞─2 ;IF RECEIVED BYTE, PRINT IT TO THE SCREEN (├╚╥╧╒╘)
╘┼╥═╘╥┘╙┼╬─:
JSR $╞╞┼4 ;TRY TO GET A CHARACTER FROM THE KEYBOARD (╟┼╘╔╬)
CMP #$00 ;WAS THERE A KEYSTROKE AVAILABLE?
BEQ ╘┼╥═╔╬┴╠ ;NO--GO BACK TO TOP OF POLLING LOOP
CMP #$03 ;CHECK FOR ╙╘╧╨ KEY
BEQ ╘┼╥═┼╪╔╘ ; EXIT IF PRESSED
JSR ╙┼╬─┬┘╘┼ ;HAVE CHAR--PUT IT INTO THE TRANSMIT BUFFER AND THEN
JMP ╘┼╥═╔╬┴╠ ; GO BACK TO TOP OF POLLING LOOP
╘┼╥═┼╪╔╘:
LDA #%0000_0010 ;DISABLE TRANSMITTER AND RECEIVER AND ALL INTERRUPTS
STA COMMAND
SEI
LDA ╧╠─╓┼├ ;RESTORE THE ╬═╔ VECTOR TO ITS ORIGINAL VALUE
STA ╬═╔╬╓
LDA ╧╠─╓┼├+1
STA ╬═╔╬╓+1
CLI
RTS ;EXIT
╘╥┴╬╙═╔╘_┬╒╞╞┼╥ = *+0
╥┼├┼╔╓┼_┬╒╞╞┼╥ = *+256
%%%---8<---CUT-HERE---8<---%%%
------------------------------------------------------------------------------
┴╨╨┼╬─╔╪: 6551 ┴├╔┴ ╚┴╥─╫┴╥┼ ╙╨┼├╙ (─┴╘┴ ╙╚┼┼╘)
├= ├OMMODORE ╙EMICONDUCTOR ╟ROUP
A DIVISION OF ├OMMODORE ┬USINESS ═ACHINES, ╔NC.
950 ╥ITTENHOUSE ╥OAD, ╬ORNSTOWN, ╨┴ 19400 * 215/666-7950 * ╘╫╪ 510-660-4168
(╩ULY 1987)
6551 ┴╙┘╬├╚╥╧╬╧╒╙ ├╧══╒╬╔├┴╘╔╧╬ ╔╬╘┼╥╞┴├┼ ┴─┴╨╘┼╥
├╧╬├┼╨╘:
╘HE 6551 IS AN ┴SYNCHRONOUS ├OMMUNICATION ┴DAPTER (┴├╔┴) INTENDED TO PROVIDE
FOR INTERFACING THE 6500/6800 MICROPROCESSOR FAMILIES TO SERIAL COMMUNICATION
DATA SETS AND MODEMS. ┴ UNIQUE FEATURE IS THE INCLUSION OF AN ON-CHIP
PROGRAMMABLE BAUD-RATE GENERATOR, WITH A CRYSTAL BEING THE ONLY EXTERNAL
COMPONENT REQUIRED.
╞┼┴╘╒╥┼╙:
* ╧N-CHIP BAUD-RATE GENERATOR: 15 PROGRAMMABLE BAUD RATES DERIVED FROM A
STANDARD STANDARD 1.8432 ═╚Z EXTERNAL CRYSTAL (50 TO 19,200 BAUD) [THESE
RATES ARE DOUBLED IN THE ╙WIFT╠INK].
* ╨ROGRAMMABLE INTERRUPT AND STATUS REGISTER TO SIMPLIFY SOFTWARE DESIGN.
* ╙INGLE +5 VOLT POWER SUPPLY.
* ╙ERIAL ECHO MODE.
* ╞ALSE START BIT DETECTION.
* 8-BIT BI-DIRECTIONAL DATA BUS FOR DIRECT COMMUNICATION WITH THE
MICROPROCESSOR.
* ┼XTERNAL 16X CLOCK INPUT FOR NON-STANDARD BAUD RATES (UP TO 125 ╦BAUD).
* ╨ROGRAMMABLE: WORD LENGTHS; NUMBER OF STOP BITS; AND PARITY-BIT GENERATION
AND DETECTION.
* ─ATA SET AND MODEM CONTROL SIGNALS PROVIDED.
* ╨ARITY: (ODD, EVEN, NONE, MARK, SPACE).
* ╞ULL-DUPLEX OR HALF-DUPLEX OPERATION.
* 5,6,7 AND 8-BIT TRANSMISSION.
* 1-═╚Z, 2-═╚Z, AND 3-═╚Z OPERATION.
╧╥─┼╥ ╬╒═┬┼╥
═╪╙ 6551 ___
- ▄
▄ +---- ╞REQUENCY RANGE
▄ ╨LAIN = 1 ═╚Z
▄ ┴ = 2 ═╚Z
▄ ┬ = 3 ═╚Z
▄
+----------- ╨ACKAGE ─ESIGNATOR
├ = ├ERAMIC
╨ = ╨LASTIC
6551 ╨╔╬ ├╧╬╞╔╟╒╥┴╘╔╧╬
+---------------+
╟╬─ --▄ 1 28 ▄-- ╥-/╫
├╙0 --▄ 2 27 ▄-- O2
/├╙1 --▄ 3 26 ▄-- /╔╥╤
/╥┼╙ --▄ 4 25 ▄-- ─┬7
╥X├ --▄ 5 24 ▄-- ─┬6
╪╘┴╠1 --▄ 6 23 ▄-- ─┬5
╪╘┴╠2 --▄ 7 22 ▄-- ─┬4
/╥╘╙ --▄ 8 21 ▄-- ─┬3
/├╘╙ --▄ 9 20 ▄-- ─┬2
╘X─ --▄ 10 19 ▄-- ─┬1
/─╘╥ --▄ 11 18 ▄-- ─┬0
╥X─ --▄ 12 17 ▄-- /─╙╥
╥╙0 --▄ 13 16 ▄-- /─├─
╥╙1 --▄ 14 15 ▄-- ╓CC
+---------------+
┬╠╧├╦ ─╔┴╟╥┴═ +----------+
▄ ╘╥┴╬╙═╔╘ ▄
▄ ├╧╬╘╥╧╠ ▄<------- ├╘╙
+----------+
▄
V
+----------+ +----------+
▄ ╘╥┴╬╙═╔╘ ▄ ▄ ╘╥┴╬╙═╔╘ ▄
/▄===>▄ ─┴╘┴ ▄=========>▄ ╙╚╔╞╘ ▄-------> ╘X─
▄▄ ▄ ╥┼╟╔╙╘┼╥ ▄ ▄ ╥┼╟╔╙╘┼╥ ▄
▄▄ +----------+ +----------+
+---------+ ▄▄
O2 --->▄ ▄ ▄▄ +----------+ +----------+
╥-/╫ --->▄ ╙┼╠┼├╘ ▄ ▄▄====▄ ╙╘┴╘╒╙ ▄ ▄ ╔╬╘┼╥╥╒╨╘▄-------> /╔╥╤
├╙0 --->▄ ┴╬─ ▄ ▄▄ ▄ ╥┼╟╔╙╘┼╥ ▄<-------->▄ ╠╧╟╔├ ▄<------- /─├─
/├╙1 --->▄ ├╧╬╘╥╧╠ ▄ ▄▄ +----------+ +----------+<------- /─╙╥
╥╙0 --->▄ ╠╧╟╔├ ▄ ▄▄
╥╙1 --->▄ ▄ ▄▄ +----------+ +----------+
/╥┼╙ --->▄ ▄ ▄▄===>▄ ├╧╬╘╥╧╠ ▄ ▄ ┬┴╒─-╥┴╘┼▄<------> ╥X├
+---------+ ▄▄ ▄ ╥┼╟╔╙╘┼╥ ▄ ▄ ╟┼╬┼╥┴╘╧╥▄<------- ╪╘┴╠1
▄▄ +----------+ +----------+<------- ╪╘┴╠2
▄▄
+---------+ ▄▄ +----------+ +----------+
─┬0 <-->▄ ─┴╘┴- ▄ ▄▄ ▄ ╥┼├┼╔╓┼ ▄ ▄ ╥┼├┼╔╓┼ ▄
... ▄ ┬╒╙ ▄<===▄▄====▄ ─┴╘┴ ▄<=========▄ ╙╚╔╞╘ ▄<---+--- ╥X─
─┬7 <-->▄ ┬╒╞╞┼╥╙ ▄ ▄▄ ▄ ╥┼╟╔╙╘┼╥ ▄ ▄ ╥┼╟╔╙╘┼╥ ▄ ▄
+---------+ ▄▄ +----------+ +-----.----+ ▄
▄▄ ▄ ▄
▄▄ +----------+ +----------+ ▄
╠┼╟┼╬─: \▄===>▄ ├╧══┴╬─ ▄ ▄ ╥┼├┼╔╓┼ ▄ ▄
▄ ╥┼╟╔╙╘┼╥ ▄ ▄ ├╧╬╘╥╧╠ ▄<---+
===> : 8-BIT LINE +----------+ +----------+
▄ ▄
---> : 1-BIT LINE ▄ +--------------------------------> /─╘╥
+-------------------------------------> /╥╘╙
═┴╪╔═╒═ ╥┴╘╔╬╟╙
<NOT INCLUDED HERE>
┼╠┼├╘╥╔├┴╠ ├╚┴╥┴├╘┼╥╔╙╘╔├╙
<NOT INCLUDED HERE>
╨╧╫┼╥ ─╔╙╙╔╨┴╘╔╧╬ VS ╘┼═╨┼╥┴╘╒╥┼
<NOT INCLUDED HERE>
╘╔═╔╬╟ ├╚┴╥┴├╘┼╥╔╙╘╔├╙
<NOT INCLUDED HERE>
╔╬╘┼╥╞┴├┼ ╙╔╟╬┴╠ ─┼╙├╥╔╨╘╔╧╬
/╥┼╙ (╥ESET)
─URING SYSTEM INITIALIZATION A LOW ON THE /╥┼╙ INPUT WILL CAUSE INTERNAL
REGISTERS TO BE CLEARED.
O2 (╔NPUT ├LOCK)
╘HE INPUT CLOCK IS THE SYSTEM O2 CLOCK AND IS USED TO TRIGGER ALL DATA
TRANSFERS BETWEEN THE SYSTEM MICROPROCESSOR AND THE 6551.
╥-/╫ (╥EAD/╫RITE)
╘HE ╥-/╫ IS GENERATED BY THE MICROPROCESSOR AND IS USED TO CONTROL THE
DIRECTION OF DATA TRANSFERS. ┴ HIGH ON THE ╥-/╫ PIN ALLOWS THE PROCESSOR
TO READ THE DATA SUPPLIED BY THE 6551. ┴ LOW ON THE ╥-/╫ PIN ALLOWS A WRITE
TO THE 6551.
/╔╥╤ (╔NTERRUPT ╥EQUEST)
╘HE /╔╥╤ PIN IS AN INTERRUPT SIGNAL FROM THE INTERRUPT-CONTROL LOGIC. ╔T IS
AN OPEN DRAIN OUTPUT, PERMITTING SEVERAL DEVICES TO BE CONNECTED TO THE COMMON
/╔╥╤ MICROPROCESSOR INPUT. ╬ORMALLY A HIGH LEVEL, /╔╥╤ GOES LOW WHEN AN
INTERRUPT OCCURS.
─┬0--─┬7 (─ATA ┬US)
╘HE ─┬0--─┬7 PINS ARE THE EIGHT DATA LINES USED FOR TRANSFER OF DATA BETWEEN
THE PROCESSOR AND THE 6551. ╘HESE LINES ARE BI-DIRECTIONAL AND ARE NORMALLY
HIGH-IMPEDANCE EXCEPT DURING ╥EAD CYCLES WHEN SELECTED.
├╙0, /├╙1 (├HIP ╙ELECTS)
╘HE TWO CHIP-SELECT INPUTS ARE NORMALLY CONNECTED TO THE PROCESSOR-ADDRESS
LINES EITHER DIRECTLY OR THROUGH DECODERS. ╘HE 6551 IS SELECTED WHEN ├╙0 IS
HIGH AND /├╙1 IS LOW.
╥╙0, ╥╙1 (╥EGISTER ╙ELECTS)
╘HE TWO REGISTER-SELECT LINES ARE NORMALLY CONNECTED TO THE PROCESSOR-ADDRESS
LINES TO ALLOW THE PROCESSOR TO SELECT THE VARIOUS 6551 INTERNAL REGISTERS.
╘HE FOLLOWING TABLE INDICATES THE INTERNAL REGISTER-SELECT CODING:
╥╙1 ╥╙0 ╫╥╔╘┼ ╥┼┴─ ╙╠-┴DDR
--- --- ---------------------- --------------------- -------
0 0 ╘RANSMIT ─ATA ╥EGISTER ╥ECEIVE ─ATA ╥EGISTER $─┼00
0 1 ╨ROGRAMMED ╥ESET* ╙TATUS ╥EGISTER $─┼01
1 0 ├OMMAND ╥EGISTER ├OMMAND ╥EGISTER $─┼02
1 1 ├ONTROL ╥EGISTER ├ONTROL ╥EGISTER $─┼03
* FOR PROGRAMMED RESET, DATA IS "DON'T CARE".
╘HE TABLE SHOWS THAT ONLY THE ├OMMAND AND ├ONTROL REGISTERS ARE READ/WRITE.
╘HE ╨ROGRAMMED ╥ESET OPERATION DOES NOT CAUSE ANY DATA TRANSFER, BUT IS USED
TO CLEAR THE 6551 REGISTERS. ╘HE ╨ROGRAMMED ╥ESET IS SLIGHTLY DIFFERENT FROM
THE ╚ARDWARE ╥ESET (/╥┼╙) AND THESE DIFFERENCES ARE DESCRIBED IN THE
INDIVIDUAL REGISTER DEFINITIONS.
┴├╔┴/═╧─┼═ ╔╬╘┼╥╞┴├┼ ╙╔╟╬┴╠ ─┼╙├╥╔╨╘╔╧╬
╪╘┴╠1, ╪╘┴╠2 (├RYSTAL ╨INS)
╘HESE PINS ARE NORMALLY DIRECTLY CONNECTED TO THE EXTERNAL CRYSTAL (1.8432
═╚Z) USED TO DERIVE THE VARIOUS BAUD RATES. ┴LTERNATIVELY, AN EXTERNALLY
GENERATED CLOCK MAY BE USED TO DRIVE THE ╪╘┴╠1 PIN, IN WHICH CASE THE ╪╘┴╠2
PIN MUST FLOAT. ╪╘┴╠1 IS THE INPUT PIN FOR THE TRANSMIT CLOCK.
╘X─ (╘RANSMIT ─ATA)
╘HE ╘X─ OUTPUT LINE IS USED TO TRANSFER SERIAL ╬╥┌ (NON-RETURN-TO-ZERO) DATA
TO THE MODEM. ╘HE ╠╙┬ (LEAST-SIGNIFICANT BIT) OF THE ╘RANSMIT ─ATA ╥EGISTER
IS THE FIRST DATA BIT TRANSMITTED AND THE REATE OF DATA TRANSMISSION IS
DETERMINED BY THE BAUD RATE SELECTED.
╥X─ (╥ECEIVE ─ATA)
╘HE ╥X─ INPUT LINE IS USED TO TRANSFER SERIAL ╬╥┌ DATA INTO THE ┴├╔┴ FROM THE
MODEM, ╠╙┬ FIRST. ╘HE RECEIVER DATA RATE IS EITHER THE PROGRAMMED BAUD RATE
OR THE RATE OF AN EXTERNALLY GENERATED RECEIVER CLOCK. ╘HIS SELECTION IS MADE
BY PROGRAMMING THE ├ONTROL ╥EGISTER.
╥X├ (╥ECEIVE ├LOCK)
╘HE ╥X├ IS A BI-DIRECTIONAL PIN WHICH SERVES AS EITHER THE RECEIVER 16X CLOCK
INPUT OR THE RECEIVER 16X CLOCK OUTPUT. ╘HE LATTER MODE RESULTS IF THE
INTERNAL BAUD RATE GENERATOR IS SELECTED FOR RECEIVER DATA CLOCKING.
/╥╘╙ (╥EQUEST TO ╙END)
╘HE /╥╘╙ OUTPUT PIN IS USED TO CONTROL THE MODEM FROM THE PROCESSOR. ╘HE
STATE OF THE /╥╘╙ PIN IS DETERMINED BY THE CONTENTS OF THE ├OMMAND ╥EGISTER.
/├╘╙ (├LEAR TO ╙END)
╘HE /├╘╙ INPUT PIN IS USED TO CONTROL THE TRANSMITTER OPERATION. ╘HE ENABLE
STATE IS WITH /├╘╙ LOW. ╘HE TRANSMITTER IS AUTOMATICALLY DISABLED IF /├╘╙ IS
HIGH.
/─╘╥ (─ATA ╘ERMINAL ╥EADY)
╘HE OUTPUT PIN IS USED TO INDICATE THE STATUS OF THE 6551 TO THE MODEM. ┴ LOW
OF /─╘╥ INDICATES THE 6551 IS ENABLED AND A HIGH INDICATES IT IS DISABLED.
╘HE PROCESSOR CONTROLS THIS PIN VIA BIT 0 OF THE ├OMMAND ╥EGISTER.
/─╙╥ (─ATA ╙ET ╥EADY)
╘HE /─╙╥ INPUT PIN IS USED TO INDICATE TO THE 6551 THE STATUS OF THE MODEM. ┴
LOW INDICATES THE "READY" STATE AND A HIGH, "NOT-READY". /─╙╥ IS A HIGH-
IMPEDANCE INPUT AND MUST NOT BE A NO-CONNECT. ╔F UNUSED, IT SHOULD BE DRIVEN
HIGH OR LOW, BUT NOT SWITCHED.
╬OTE: ╔F ├OMMAND ╥EGISTER ┬IT #0 = 1 AND A CHANGE OF STATE ON /─╙╥ OCCURS,
/╔╥╤ WILL BE SET AND ╙TATUS ╥EGISTER ┬IT #[5] WILL REFLECT THE NEW LEVEL. ╘HE
STATE OF /─╙╥ DOES NOT AFFECT ╘RANSMITTER OPERATION [BUT MUST BE LOW FOR THE
╥ECEIVER TO OPERATE]. [╘HIS STATEMENT REFLECTS THE ╙WIFT╠INK IMPLEMENTATION].
/─├─ (─ATA ├ARRIER ─ETECT)
╘HE /─├─ INPUT PIN IS USED TO INDICATE TO THE 6551 THE STATUS OF THE CARRIER-
DETECT OUTPUT OF THE MODEM. ┴ LOW INDICATES THAT THE MODEM CARRIER SIGNAL IS
PRESENT AND A HIGH, THAT IT IS NOT. /─├─, LIKE /─╙╥, IS A HIGH-IMPEDANCE
INPUT AND MUST NOT BE A NO-CONNECT.
╬OTE: ╔F ├OMMAND ╥EGISTER ┬IT #0 = 1 AND A CHANGE OF STATE ON /─╙╥ OCCURS,
/╔╥╤ WILL BE SET AND ╙TATUS ╥EGISTER ┬IT #[6] WILL REFLECT THE NEW LEVEL. ╘HE
STATE OF /─├─ DOES NOT AFFECT EITHER ╘RANSMITTER OR ╥ECEIVER OPERATION.
╔╬╘┼╥╬┴╠ ╧╥╟┴╬╔┌┴╘╔╧╬
<NOT INCLUDED HERE>
╘╥┴╬╙═╔╘ ┴╬─ ╥┼├┼╔╓┼ ─┴╘┴ ╥┼╟╔╙╘┼╥╙ (╙╠-┴DDR: $─┼00 / 56832)
╘HESE REGISTERS ARE USED AS TEMPORARY DATA STORAGE FOR THE 6551 ╘RANSMIT AND
╥ECEIVE CIRCUITS. ╘HE ╘RANSMIT ─ATA ╥EGISTER IS CHARACTERIZED AS FOLLOWS:
* ┬IT 0 IS THE LEADING BIT TO BE TRANSMITTED.
* ╒NUSED DATA BITS ARE THE HIGH-ORDER BITS AND ARE "DON'T CARE" FOR
TRANSMISSION.
╘HE ╥ECEIVE ─ATA ╥EGISTER IS CHARACTERIZED IN A SIMILAR FASHION:
* ┬IT 0 IS THE LEADING BIT RECEIVED.
* ╒NUSED DATA BITS ARE THE HIGH-ORDER BITS AND ARE "0" FOR THE RECEIVER.
* ╨ARITY BITS ARE NOT CONTAINED IN THE ╥ECEIVE ─ATA ╥EGISTER, BUT ARE STRIPPED
OFF AFTER BEING USED FOR EXTERNAL PARITY CHECKING. ╨ARITY AND ALL UNUSED
HIGH-ORDER BITS ARE "0".
╘RANSMIT / ╥ECEIVE ─ATA ╥EGISTER
+-----+-----+-----+-----+-----+-----+-----+-----+
▄ 7 ▄ 6 ▄ 5 ▄ 4 ▄ 3 ▄ 2 ▄ 1 ▄ 0 ▄
+-----+-----+-----+-----+-----+-----+-----+-----+
▄ DATA ▄
╘HE FOLLOWING FIGURE ILLUSTRATES A SINGLE TRANSMITTED OR RECEIVED DATA
WORD, FOR THE EXAMPLE OF 8 DATA BITS, PARITY, AND 1 STOP BIT:
"═┴╥╦"____ ________________________________________________________"═┴╥╦"
▄ ▄ 0 ▄ 1 ▄ 2 ▄ 3 ▄ 4 ▄ 5 ▄ 6 ▄ 7 ▄ 8 ▄ ╨ ▄ ╙ .
▄____▄____▄____▄____▄____▄____▄____▄____▄____▄____▄____▄
START PARITY STOP
BIT ...DATA BITS... BIT BIT
╙╘┴╘╒╙ ╥┼╟╔╙╘┼╥ (╙╠-┴DDR: $─┼01 / 56833)
╘HE ╙TATUS ╥EGISTER IS USED TO INDICATE TO THE PROCESSOR THE STATUS OF VARIOUS
6551 FUNCTIONS AND IS OUTLINED HERE:
├OMMAND ╥EGISTER
+-----+-----+-----+-----+-----+-----+-----+-----+
▄ 7 ▄ 6 ▄ 5 ▄ 4 ▄ 3 ▄ 2 ▄ 1 ▄ 0 ▄
+-----+-----+-----+-----+-----+-----+-----+-----+
▄ IRQ ▄ DCD ▄ DSR ▄ TXR ▄ RXR ▄ OVR ▄ FE ▄ PE ▄
+---+
▄ 7 ▄ /╔╥╤*** : CLEARED BY READING STATUS REGISTER
+---+ --------------------------------------------
0 ╬O INTERRUPT
1 ╔NTERRUPT
+---+
▄ 6 ▄ /─├─ : NON-RESETABLE, INDICATES /─├─ STATUS
+---+ --------------------------------------------
0 /─├─ LOW
1 /─├─ HIGH
+---+
▄ 5 ▄ /─╙╥ : NON-RESETABLE, INDICATES /─╙╥ STATUS
+---+ --------------------------------------------
0 /─╙╥ LOW
1 /─╙╥ HIGH
+---+
▄ 4 ▄ ╘RANSMIT ─ATA ╥EGISTER ┼MPTY: ├LEARED BY WRITE TO ╘X ─ATA REG
+---+ -------------------------------------------------------------
0 ╬OT EMPTY
1 ┼MPTY
+---+
▄ 3 ▄ ╥ECEIVE ─ATA ╥EGISTER ╞ULL: ├LEARED BY READ FROM ╥X ─ATA REG
+---+ -------------------------------------------------------------
0 ╬OT FULL
1 ╞ULL
+---+
▄ 2 ▄ ╧VERRUN*: ╙ELF-CLEARING**
+---+ -------------------------
0 ╬O ERROR
1 ┼RROR
+---+
▄ 1 ▄ ╞RAMING ┼RROR*: ╙ELF-CLEARING**
+---+ -------------------------------
0 ╬O ERROR
1 ┼RROR
+---+
▄ 0 ▄ ╨ARITY ┼RROR*: ╙ELF-CLEARING**
+---+ ------------------------------
0 ╬O ERROR
1 ┼RROR
╬OTES: * ╬O INTERRUPT GENERATED FOR THESE CONDITIONS
** ├LEARED AUTOMATICALLY AFTER A READ OF ╥─╥ AND THE NEXT ERROR-
FREE RECEIPT OF DATA
*** ╥EADING STATUS REG. WILL CLEAR THE /╔╥╤ BIT EXCEPT WHEN
TRANSMIT INTR. ENABLED
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
▄ 0 ▄ X ▄ X ▄ 1 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ ┴FTER ╚ARDWARE RESET
+---+---+---+---+---+---+---+---+
▄ X ▄ X ▄ X ▄ X ▄ X ▄ 0 ▄ X ▄ X ▄ ┴FTER ╙OFTWARE RESET
+---+---+---+---+---+---+---+---+
├╧══┴╬─ ╥┼╟╔╙╘┼╥ (╙╠-┴DDR: $─┼02 / 56834)
╘HE ├OMMAND ╥EGISTER IS USED TO CONTROL SPECIFIC ╘RANSMIT/╥ECEIVE FUNCTIONS
AND IS SHOWN HERE:
├OMMAND ╥EGISTER
+-----+-----+-----+-----+-----+-----+-----+-----+
▄ 7 ▄ 6 ▄ 5 ▄ 4 ▄ 3 ▄ 2 ▄ 1 ▄ 0 ▄
+-----+-----+-----+-----+-----+-----+-----+-----+
▄ PARITY ▄ ECHO▄ TX CTRL ▄ RXI ▄ DTR ▄
+---+---+---+
▄ 7 ▄ 6 ▄ 5 ▄ ╨┴╥╔╘┘ ├╚┼├╦ ├╧╬╘╥╧╠╙
+---+---+---+ ----------------------
X X 0 PARITY DISABLED--NO PARITY BIT GENERATED OR RECEIVED
0 0 1 ODD PARITY RECEIVER AND TRANSMITTER
0 1 1 EVEN PARITY RECEIVER AND TRANSMITTER
1 0 1 MARK PARITY TRANSMITTED, PARITY CHECK DISABLED
1 1 1 SPACE PARITY TRANSMITTED, PARITY CHECK DISABLED
+---+
▄ 4 ▄ ╬╧╥═┴╠/┼├╚╧ ═╧─┼ ╞╧╥ ╥┼├┼╔╓┼╥
+---+ ------------------------------
0 ╬ORMAL
1 ┼CHO (BITS 2 AND 3 MUST BE "0")
+---+---+
▄ 3 ▄ 2 ▄ ╘X ╔╬╘┼╥╥╒╨╘ ╥╘╙ ╠┼╓┼╠ ╘╥┴╬╙═╔╘╘┼╥
+---+---+ ------------ --------- ------------
0 0 ─ISABLED ╚IGH ╧FF
0 1 ┼NABLED ╠OW ╧N
1 0 ─ISABLED ╠OW ╧N
1 1 ─ISABLED ╠OW ╘RANSMIT ┬╥╦
+---+
▄ 1 ▄ ╥┼├┼╔╓┼ ╔╬╘┼╥╥╒╨╘ ┼╬┴┬╠┼
+---+ -------------------------
0 /╔╥╤ INTERRUPT ┼NABLED FROM BIT 3 OF ╙TATUS ╥EGISTER
1 /╔╥╤ INTERRUPT ─ISABLED
+---+
▄ 0 ▄ ─┴╘┴ ╘┼╥═╔╬┴╠ ╥┼┴─┘
+---+ --------------------
0 ─ISABLE ╥ECEIVER AND ALL INTERRUPTS (/─╘╥ HIGH)
1 ┼NABLE ╥ECEIVER AND ALL INTERRUPTS (/─╘╥ LOW)
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ ┴FTER ╚ARDWARE RESET
+---+---+---+---+---+---+---+---+
▄ X ▄ X ▄ X ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ ┴FTER ╙OFTWARE RESET
+---+---+---+---+---+---+---+---+
├╧╬╘╥╧╠ ╥┼╟╔╙╘┼╥ (╙╠-┴DDR: $─┼03 / 56835 / CPM: 0001XXXX)
╘HE ├ONTROL ╥EGISTER IS USED TO SELECT THE DESIRED MODE FOR THE 6551. ╘HE
WORD LENGTH, NUMBER OF STOP BITS, AND CLOCK CONTROLS ARE ALL DETERMINED
BY THE ├ONTROL ╥EGISTER, WHICH IS SHOWN HERE:
├ONTROL ╥EGISTER
+-----+-----+-----+-----+-----+-----+-----+-----+
▄ 7 ▄ 6 ▄ 5 ▄ 4 ▄ 3 ▄ 2 ▄ 1 ▄ 0 ▄
+-----+-----+-----+-----+-----+-----+-----+-----+
▄STOPS▄ WORD LEN ▄ SRC ▄ BAUD RATE ▄
+---+
▄ 7 ▄ ╙╘╧╨ ┬╔╘╙
+---+ ----------
0 1 STOP BIT
1 2 STOP BITS
1 1 STOP BIT IF WORD LENGTH== 8 BITS AND PARITY
THIS ALLOWS FOR 9-BIT TRANSMISSION (8 DATA BITS PLUS PARITY)
1 1.5 STOP BITS IF WORD LENGTH== 5 BITS AND NO PARITY
+---+---+
▄ 6 ▄ 5 ▄ ╫╧╥─ ╠┼╬╟╘╚
+---+---+ ------------
0 0 8 BITS
0 1 7 BITS
1 0 6 BITS
1 1 5 BITS
+---+
▄ 4 ▄ ╥┼├┼╔╓┼╥ ├╠╧├╦ ╙╧╒╥├┼
+---+ ----------
0 EXTERNAL RECEIVER CLOCK
1 BAUD RATE GENERATOR
+---+---+---+---+
▄ 3 ▄ 2 ▄ 1 ▄ 0 ▄ ┬┴╒─ ╥┴╘┼ ╟┼╬┼╥┴╘╧╥
+---+---+---+---+ --------------------
0 0 0 0 16X EXTERNAL CLOCK
0 0 0 1 100 BAUD
0 0 1 0 150 BAUD
0 0 1 1 219.84 BAUD
0 1 0 0 269.16 BAUD
0 1 0 1 300 BAUD
0 1 1 0 600 BAUD
0 1 1 1 1200 BAUD
1 0 0 0 2400 BAUD
1 0 0 1 3600 BAUD
1 0 1 0 4800 BAUD
1 0 1 1 7200 BAUD
1 1 0 0 9600 BAUD
1 1 0 1 14400 BAUD
1 1 1 0 19200 BAUD
1 1 1 1 38400 BAUD
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ ┴FTER ╚ARDWARE RESET
+---+---+---+---+---+---+---+---+
▄ X ▄ X ▄ X ▄ X ▄ X ▄ X ▄ X ▄ X ▄ ┴FTER ╙OFTWARE RESET
+---+---+---+---+---+---+---+---+
========================================================================
─ESIGN AND ╔MPLEMENTATION OF A ╙IMPLE/┼FFICIENT ╒PLOAD/─OWNLOAD ╨ROTOCOL
BY ├RAIG ┬RUCE <CSBRUCE@CCNGA.UWATERLOO.CA>
1. ╔╬╘╥╧─╒├╘╔╧╬
╔F YOU USE YOUR ├OMMODORE FOR TELECOMMUNICATIONS, THEN YOU ARE BASICALLY
INTERESTED IN TWO THINGS: USING YOUR ├= TO EMULATE A TERMINAL FOR INTERACTIVE
STUFF, AND USING MODEM-FILE-TRANSFER PROTOCOLS TO UPLOAD AND DOWNLOAD FILES
FROM AND TO YOUR ├OMMODORE.
╘HIS DOCUMENT DESCRIBES A CUSTOM UPLOAD/DOWNLOAD PROTOCOL THAT WAS DESIGNED
FOR USE WITH THE ┴├┼-128/64 SYSTEM AND IS FREELY AVAILABLE TO ANYONE WHO WANTS
IT (WELL, WHEN ╔ FINISH WITH THE ╥ELEASE #14 OF ┴├┼). ╫HILE THIS PROTOCOL
NON-STANDARD, IT BLOWS THE DOORS OFF OF ALL OTHER PROTOCOLS AVAILABLE FOR
├OMMODORE COMPUTERS, EVEN THOUGH IT USES A SIMPLE "STOP-AND-WAIT"
ACKNOWLEDGEMENT SCHEME. ╘HERE ARE TWO REASONS FOR ITS SPEED: THE FAST DEVICE
DRIVERS AVAILABLE WITH ┴├┼, AND ITS LARGE PACKET SIZE, UP TO ABOUT 18╦
(ALTHOUGH THIS COULD BE SIGNIFICANTLY LARGER IS ┴├┼'S MEMORY USAGE WERE
REORGANIZED).
╘HE NAME OF THE PROTOCOL IS "├RAIG'S ╞ILE E╪CHANGE ╨ROTOCOL", OR JUST "╞╪" FOR
SHORT. ╔T IS "FILE EXCHANGE" RATHER THAN "UPLOAD" OR "DOWNLOAD" BECAUSE YOU
WILL USE THE SAME ACTIVATION OF THE PROGRAM TO BOTH UPLOAD AND DOWNLOAD ALL OF
THE FILES YOU NAME.
2. ╒╙┴╟┼
╘HE CURRENT IMPLEMENTATION OF ╞╪ CONSISTS OF A "CLIENT" PROGRAM FOR YOU TO RUN
ON YOUR ├OMMODORE COMPUTER AND A "SERVER" PROGRAM THAT YOU RUN ON YOUR ╒NIX
HOST. ╘HERE IS CURRENTLY NO SERVER PROGRAM FOR ANY OTHER PLATFORM, BUT THE
NECESSARY CHANGES TO THE ├-LANGUAGE PROGRAM WOULDN'T BE TOO HARD. ╘HE CLIENT
PROGRAM IS WRITTEN IN 6502 ASSEMBLER, OF COURSE (FOR THE ┴├┼-ASSEMBLER TO BE
SPECIFIC).
╞╪ IS AN EXTERNAL PROGRAM FROM THE TERMINAL PROGRAM, SO (FOR NOW) TO ACTIVATE
╞╪, YOU HAVE TO EXIT FROM THE TERMINAL PROGRAM AND ENTER THE ╞╪ COMMAND LINE,
EXCHANGE THE FILES, AND THEN RE-ENTER THE TERMINAL PROGRAM FROM THE COMMAND
LINE.
╫HEN YOU RUN ╞╪, YOU WILL ACTIVATE THE ╙ERVER PROGRAM FIRST ON YOUR ╒NIX HOST
AND THEN EXIT THE TERMINAL PROGRAM AND RUN THE ├LIENT PROGRAM ON YOUR
├OMMODORE. ┘OU RUN THE COMMAND "FX" ON BOTH THE CLIENT AND SERVER MACHINES,
WHICH MAY BE A LITTLE CONFUSING (BUT ╔ THINK YOU'LL GET USED TO IT), AND NAME
THE FILES THAT YOU WANT TO HAVE TRANSFERRED AS ARGUMENTS TO THE COMMAND ON THE
MACHINE THAT YOU WANT TO TRANSFER THE FILES ╞╥╧═. ╘HE USAGE OF THE "FX"
COMMAND IS AS FOLLOWS:
FX [-DLV╓7] [-M MAXIMUMS] [-F ARGFILE] [[-B] BINFILE ...] [-T TEXTFILE ...]
-D = DEBUG MODE
-L = WRITE TO LOG FILE ("FX.LOG")
-V = VERBOSE LOG/DEBUG MODE
-╓ = EXTREMELY VERBOSE LOG/DEBUG MODE
-7 = USE SEVEN-BIT ENCODING
-M = SET MAXIMUM PACKET SIZES; MAXIMUMS = ULBIN/ULTXT/DLBIN/DLTXT (BYTES)
-F = TAKE ARGUMENTS ONE-PER-LINE FROM GIVEN ARGFILE
-B = BINARY FILES PREFIX
-T = TEXT FILES PREFIX
-HELP = HELP
WELL, FOR THE SERVER, ANYWAY. ╘HE CLIENT PROGRAM DOESN'T HAVE THE MORE
EXOTIC OPTIONS. ╘HE "-D", "-L", "-V", AND "-╓" OPTIONS ARE AVAILABLE ONLY
ON THE ╙ERVER PROGRAM, AND ARE FOR DEBUGGING PURPOSES ONLY.
╘HE "-7" OPTION TELLS THE PROTOCOL TO USE ONLY 7-BIT DATA. ╔.E., IT TELLS IT
TO NOT USE THE 8TH BIT POSITION IN THE DATA IS TRANSMITTED. ╘HIS IS USEFUL IF
YOU ARE FORCED INTO THE HUMILIATION OF ONLY BEING ABLE TO USE A 7-BIT CHANNEL
TO YOUR ╒NIX HOST. ┘OU NEED ONLY NEED TO GIVE THIS OPTION ON EITHER THE
CLIENT OR THE HOST COMMAND LINE AND THE OTHER SIDE WILL BE INFORMED. ╔T MAY
BE USEFUL TO CREATE AN ALIAS FOR THIS COMMAND WITH ALL OF YOUR OPTIONS SET TO
WHAT YOU WANT THEM TO BE.
╘HE PROTOCOL HAS THE CAPACITY TO USE DIFFERENT PACKET SIZES FOR FOUR TYPES OF
FILE-TRANSFER SITUATIONS: UPLOADING BINARY DATA, UPLOADING TEXT, DOWNLOADING
BINARY DATA, AND DOWNLOADING TEXT. ╘HESE ARE USEFUL DISTINCTIONS, SINCE YOUR
HOST MAY OR MAY NOT BE ABLE TO HANDLE THE LARGER PACKET SIZES WITHOUT LOSING
BYTES (YOUR ├OMMODORE, OF COURSE, CAN HANDLE THE LARGER PACKET SIZES WITH NO
PROBLEMS).
╔N DETERMINING WHICH PACKET SIZE TO USE FOR A FILE TRANSFER (WHERE THE TYPE OF
TRANSFER IS KNOWN), THE PROTOCOL FINDS THAT LARGEST PACKET SIZE THAT BOTH THE
CLIENT AND THE SERVER CAN HANDLE AND THEN TAKE THE MINIMUM OF THESE TWO
VALUES. ╘HE DEFAULTS FOR THE CLIENT ARE ALL THE SAME: THE MAXIMUM AMOUNT OF
PROGRAM-AREA MEMORY THAT IT CAN USE, ABOUT 18╦. ╞OR THE SERVER PROGRAM, ╔
HAVE PROGRAMMED IN DEFAULT MAXIMUM UPLOADING PACKET SIZES OF 1╦ AND MAXIMUM
DOWNLOADING PACKET SIZES OF 64╦-1. ┘OU CAN CHANGE THESE DEFAULTS IN THE ├
PROGRAM EASILY BY CHANGING SOME "#DEFINE"S.
╘HE "-M" OPTION ALLOWS YOU TO MANUALLY SET THE DEFAULT PACKET SIZES FOR A
TRANSFER. ╘HE ARGUMENT FOLLOWING THE "-M" FLAG SHOULD HAVE FOUR NUMBERS WITH
SLASHES BETWEEN THEM, WHICH GIVE THE MAXIMUM ULBIN/ULTXT/DLBIN/DLTXT PACKET
SIZES, RESPECTIVELY. ╬OTE THAT THE PACKET SIZES ONLY INCLUDE THE SIZE OF THE
USER DATA ENCODED INTO PACKETS AND NOT THE CONTROL OR QUOTING INFORMATION
(BELOW).
╘HE "-F" OPTION ON THE SERVER ALLOWS YOU TO READ ARGUMENTS FROM A FILE RATHER
THAN THE COMMAND LINE. ╘HIS IS USEFUL IF WANT TO GENERATE AND EDIT THE LIST
OF FILES TO DOWNLOAD BEFORE YOU RUN THE ╞╪ COMMAND. ╔T'S ALSO USEFUL IF YOU
DON'T WANT OTHER USERS TO SEE THE NAMES OF THE FILES THAT YOU ARE
DOWNLOADING. ╘HE NAME OF THE FILE COMES IN THE FIRST ARGUMENT FOLLOWING THE
"-F" FLAG AND THE ARGUMENTS ARE PUT INTO THIS FILE ONE-PER-LINE. ┘OU CAN PUT
IN "-" OPTIONS IN ADDITION TO FILENAMES IF YOU WISH (LIKE "-T" AND "-B").
╘HIS OPTION IS NOT SUPPORTED ON THE CLIENT PROGRAM.
╞INALLY COME THE "-B", "-T", AND FILENAME ARGUMENTS. ╘HE "-B" ARGUMENT TELLS
╞╪ THAT ALL OF THE FOLLOWING FILENAMES (UNTIL THE NEXT "-T" OPTION) ARE BINARY
FILES AND THE "-T" ARGUMENT SAYS THAT THE FOLLOWING FILENAMES ARE ALL OF TEXT
FILES. ┘OU CAN USE AS MANY "-B" AND "-T" ARGUMENTS AS YOU WANT. ╔F YOU DON'T
USE ANY, THEN ALL OF THE FILES YOU NAME WILL BE ASSUMED TO BE BINARY FILES.
╞OR EACH FILENAME YOU GIVE ON A COMMAND LINE, THAT FILE WILL BE TRANSFERRED
FROM THAT MACHINE TO THE OTHER MACHINE. ╧N BOTH ╒NIX AND ┴├┼, YOU CAN USE
WILDCARDS IN YOUR FILENAMES, OF COURSE, TO TRANSFER GROUPS OF FILES.
╘HE CLIENT PROGRAM CONTROLS THE FILE EXCHANGE, AND IT UPLOADS ALL OF ITS FILES
FIRST AND THEN ASKS THE SERVER IF THE SERVER HAS ANY FILES TO BE DOWNLOADED.
╫HEN THE EXCHANGE IS COMPLETED, BOTH THE CLIENT AND SERVER ╞╪ PROGRAMS WILL
EXIT AND YOU WILL FIND YOURSELF BACK ON THE COMMAND LINES IN BOTH
ENVIRONMENTS. ╥E-ENTER THE TERMINAL PROGRAM TO CONTINUE WITH YOUR ONLINE
SESSION. ╔F SOMETHING GOES VERY WRONG DURING A TRANSFER OR IF YOU DECIDE THAT
YOU DON'T REALLY WANT TO TRANSFER ANY FILES AFTER ACTIVATING THE SERVER
PROGRAM, YOU CAN TYPE THREE ├TRL-╪'S TO ABORT THE SERVER. ╘HIS IS THE SAME AS
FOR THE ╪-MODEM PROTOCOL.
3. ─┼╙╔╟╬ ─┼├╔╙╔╧╬╙
╘HERE ARE A NUMBER OF DESIGN DECISIONS TO BE MADE ABOUT OUR PROTOCOL. ┬UT
FIRST, WE WANT TO RECOGNIZE AND APPRECIATE THAT SINCE WE HAVE A LICENSE TO
DESIGN A COMPLETELY NEW PROTOCOL, WE ARE NOT BOUND, SHACKLED, GAGGED, AND
TORTURED BY THE "HYSTERICAL RAISINS" AND BAD DESIGN DECISIONS OF EXISTING
COMPROMISED AND BLOATED STANDARD PROTOCOLS... SUCH AS ┌-MODEM.
╫E WANT THE PROTOCOL TO UNDERSTAND WHETHER A FILE IS TEXT OR BINARY DATA AND
TO TRANSLATE THEM APPROPRIATELY DURING DOWNLOADING. ╫E WANT THE PROTOCOL TO
BE AWARE OF FILENAMES, DATES, PERMISSIONS, AND WE DO NOT WANT OUR FILE
CONTENTS TO GET MANGLED LIKE THEY DO WITH ╪-MODEM (IT PADS THEM WITH ├TRL-┌'S,
SINCE IT WAS DESIGNED FOR ├╨/═), AND WE WANT IT TO TRANSLATE TO/FROM ╨┼╘╙├╔╔
IF THE FILE IS TEXT. ╫E WILL REQUIRE THAT THE USER TELL US WHETHER THE FILE
IS BINARY OR TEXT (ALTHOUGH WE MAY BE ABLE TO STATISTICALLY DETERMINE THIS
FROM SNOOPING THROUGH THE FILE), AND WE WILL USE A "CANONICAL FORM" FOR
ENCODING THE TEXT DATA DURING TRANSFER. ┴ CONVENIENT CANONICAL FORM TO USE IS
╒NIX-┴╙├╔╔ (┴╙├╔╔-╠╞).
╫E WANT OUR PROTOCOL TO BE SIMULTANEOUSLY SIMPLE AND FAST. ╘O MAKE IT SIMPLE,
WE WILL USE A STOP-AND-WAIT ACKNOWLEDGEMENT SCHEME. ╘HIS MEANS THAT AFTER
EACH PACKET IS UPLOADED OR DOWNLOADED, THE TRANSFER WILL PAUSE AND WAIT FOR
THE RECEIVING HOST TO ACKNOWLEDGE THAT THE PACKET HAS BEEN TRANSFERRED
CORRECTLY, AND ONLY THEN WILL THE PROTOCOL CONTINUE TO TRANSFER MORE DATA.
╔N FACT, THIS SCHEME FITS WELL WITH THE ├OMMODORE HARDWARE, SINCE IT IS NOT
POSSIBLE TO SEND OR RECEIVE SERIAL DATA WHILE DOING DISK ╔/╧ (IN THE GENERAL
CASE), SO WE WOULD HAVE TO STOP LISTENING ANYWAY; THE PROTOCOL MAKES IT SO
THAT THERE WILL BE NO BYTES THAT WE END UP IGNORING WHILE DOING ╔/╧.
╘O MAKE THE PROTOCOL BE FAST EVEN THOUGH WE ARE USING A STOP-AND-WAIT
ACKNOWLEDGEMENT SCHEME, WE WILL USE THE LARGEST DATA-PACKET SIZES THAT WE
POSSIBLY CAN. ╔N THE (CURRENT) ┴├┼ ENVIRONMENT, THIS MEANS ABOUT 18╦. ╘HIS
WILL MAXIMIZE THE AMOUNT OF TIME OF TRANSFERRING DATA OVER THE MODEM BETWEEN
PAUSES TO DO ╔/╧. ╔F THE ╔/╧ IS TO THE ┴├┼ RAMDISK, THEN THE LENGTH OF THIS
PAUSE WILL BE VERY SHORT AND WE WILL ACHIEVE A VERY HIGH LINK UTILIZATION.
(╘HE ┴├┼ RAMDISK CAN PROCESS AN 18╦ READ/WRITE REQUEST IN ABOUT 20
MILLISECONDS ON A ╞AST-MODE ├128 USING AN ╥┼╒ --- ╥┴═─╧╙ IN THE SAME
ENVIRONMENT WOULD REQUIRE ABOUT 9 _SECONDS_ (450X SLOWER)).
╘O ALLOW FOR FUTURE USE WITH OTHER PLATFORMS, WE WILL MAKE THE PROTOCOL DEFINE
THE PACKET SIZES USING 32-BIT FIELDS. ╘HERE ISN'T MUCH DATA OVERHEAD, AND
THIS ALLOWS US TO CHANGE IMPLEMENTATIONS TO BE ABLE TO TRANSFER ENTIRE FILES
IN ONE LARGE PACKET. ┴LSO, THE SIZE OF AN INDIVIDUAL PACKET SHOULD BE
FLEXIBLE: BE FROM ONE TO ╬ BYTES. ╘HIS ELIMINATES THE ╪-MODEM PADDING PROBLEM
AND THE ┘-MODEM CRUFTY HACK OF USING THE SMALL PACKET SIZE WHEN LESS THAN 1╦
OF USER DATA REMAINS TO BE TRANSFERRED.
╫E ALSO WANT OUR DATA TO BE WELL PROTECTED AGAINST CORRUPTION. ─ETECTING
TRANSMISSION ERRORS EFFICIENTLY ON ├OMMODORE COMPUTERS IS ALREADY A WELL
SOLVED PROBLEM: WE WILL USE A TABLE-DRIVEN ├╥├-32 ALGORITHM, THE SAME ONE THAT
┌═╧─┼═, ╨╦┌╔╨, AND ├╥├32 USE. ╘O HIDE THE COMPUTATION COSTS OF THE ├╥├ EVEN
MORE (THE COST IS VERY LOW ANYWAY), WE WILL COMPUTE IT ╫╚╔╠┼ SENDING OR
RECEIVING PACKETS. ╧H, ACTUALLY, ╔ GUESS THAT ╔ FORGOT TO MENTION AN A-PRIORI
DESIGN DECISION: WE WILL BE USING A PACKET-ORIENTED APPROACH FOR TRANSFERRING
DATA (DESCRIBED BELOW); PACKETIZATION OFFERS SO MANY ADVANTAGES THAT THIS
DECISION IS REALLY A NO-BRAINER.
┴LSO, TO MAKE THE PROCESS INTERACTION AS STRAIGHTFORWARD AS POSSIBLE, WE WANT
TO USE THE ├LIENT/╙ERVER PROGRAMMING PARADIGM. ╘HIS PARADIGM COMBINES WELL
WITH THE STOP-AND-WAIT ACKNOWLEDGEMENT SCHEME TO PRODUCE A ╥EMOTE ╨ROCEDURE
├ALL (╥╨├) TYPE OF INTERACTION BETWEEN THE MACHINES. ╞OR THOSE NOT FAMILIAR
WITH THIS ╔NTERPROCESS ├OMMUNICATION (╔╨├) SCHEME, YOU CAN READ A COUPLE
ISSUES OF ├= HACKING AGO WHERE ╔ TALKED ABOUT IT FOR USE WITH A MULTITASKING
OPERATION SYSTEM. ╥╨├ IS A VERY USEFUL, POWERFUL, SIMPLE, AND WIDELY
APPLICABLE ╔╨├ SCHEME.
╘O RECOVER FROM PACKET CORRUPTION, WE WILL BE USING A TIMEOUT+RETRANSMISSION
SCHEME, AND TO BE CONSISTENT WITH THE ╥╨├ SCHEME, THE CLIENT WILL DO ALL
TIMEOUTS AND RETRANSMISSIONS. ╘HIS MEANS THAT AFTER SENDING A REQUEST ╥╨├
PACKET OUT, IF WE DON'T RECEIVE THE REPLY WITHIN A CERTAIN PERIOD OF TIME, WE
WILL TIMEOUT AND SEND THE REQUEST AGAIN. ╧R, TO BE MORE PRECISE, SINCE WE
WILL BE WORKING WITH LARGE PACKET SIZES, WE WILL TIMEOUT IF WE DON'T RECEIVE
ANY BYTES FROM THE SERVER FOR A CERTAIN PERIOD OF TIME, SAY 5 SECONDS, WHILE
WE ARE EXPECTING MORE BYTES FROM HIM.
╘HE WAY THAT CORRUPTED PACKETS ARE DEALT WITH IS VERY SIMPLE: THEY ARE
IGNORED. ╘HE SERVER COULD POSSIBLY SEND BACK A NEGATIVE ACKNOWLEDGEMENT,
BUT WE WON'T TRY THAT FOR NOW.
╔N ORDER TO MAKE RETRANSMISSIONS WORK OUT CORRECTLY, WE WILL BE USING SEQUENCE
NUMBERS AND INTERNAL-STATE VARIABLES INSIDE OF THE SERVER TO INSURE THAT
REQUESTS AREN'T CARRIED OUT MORE THAN ONCE. ╫E NEED THESE MECHANISMS BECAUSE
WHEN AN ╥╨├ FAILS, WE WON'T KNOW IF WE GOT NO RESPONSE BECAUSE THE ORIGINAL
REQUEST WAS LOST AND THE OPERATIONS WASN'T CARRIED OUT, OR WHETHER THE REQUEST
WAS RECEIVED AND CARRIED OUT BUT THE REPLY MESSAGE WAS LOST.
╞OR EXAMPLE, IF WE REQUEST THAT PACKET #123 BE DOWNLOADED AND THE SERVER
CARRIES OUT THAT REQUEST BUT THE REPLY MESSAGE IS LOST, THEN THE CLIENT WILL
TIME OUT AND RETRANSMIT THE REQUEST. ╘HE SERVER REMEMBERS THE LAST REQUEST
NUMBER THAT THE CLIENT SENT IT (123 HERE), SO IF THE CLIENT ASKS FOR PACKET
#123 AGAIN, THE SERVER WILL SIMPLY RETRANSMIT THE REPLY THAT IT GAVE LAST
TIME. ╔F, ON THE OTHER HAND, THE CLIENT WERE TO REQUEST PACKET #124 (OR
SIMPLY "NOT 123"), THEN THE SERVER READS THE NEXT CHUNK OF DATA FROM THE FILE
AND SENDS IT AS THE REPLY. ╧UR PROTOCOL WILL USE AN 8-BIT SEQUENCE NUMBER
EVEN THOUGH IT ONLY NEEDS A 1-BIT SEQUENCE NUMBER (SINCE EIGHT BITS WILL ALLOW
FOR THE FUTURE EXPANSION OF HAVING MULTIPLE REQUESTS BEING PROCESSED
CONCURRENTLY: ASYNCHRONOUS ╥╨├).
╫E ALSO WANT TO BE ABLE TO BOTH UPLOAD AND DOWNLOAD AS CONVENIENTLY AS
POSSIBLE. ╘O ME, THIS MEANS DOING BOTH OPERATIONS BY CALLING ONLY ONE COMMAND
(AS DESCRIBED IN THE PREVIOUS SECTION). ╘HIS ARRANGEMENT ALSO ALLOWS FOR THE
FUTURE EXPANSION OF UPLOADING AND DOWNLOADING FILES _SIMULTANEOUSLY_ (THE
PROTOCOL AS DESIGNED PLACES NO RESTRICTIONS ON THIS POSSIBILITY).
╫E ALSO WANT TO MAKE USE OF AN EIGHT-BIT CLEAN LINK BETWEEN THE ╒NIX HOST AND
YOUR ├OMMODORE, BUT THIS MAY NOT ALWAYS BE POSSIBLE. ╙OMETIMES YOU MAY HAVE
ONLY A 7-BIT CONNECTION, AND EVEN IF YOU DO HAVE AN 8-BIT CONNECTION, THERE
MAY STILL BE SOME SOFTWARE-FLOW-CONTROL PROBLEMS WITH INTERMEDIATE DEVICES
BETWEEN YOUR ├OMMODORE AND YOUR ╒NIX HOST. ╙O, WE WANT OUR PROTOCOL TO NOT
MAKE USE OF THE ╪-ON AND ╪-OFF CHARACTERS, AND TO USE ONLY 7-BIT CHARACTERS IF
IT CANNOT USE EIGHT. ╘HE WAY TO ACHIEVE THIS IS CALLED "ESCAPING", "QUOTING"
OR "BYTE STUFFING", AND WILL BE DISCUSSED IN THE NEXT SECTION. ╔T TURNS OUT
THAT SUPPORTING 7-BIT CHARACTERS IS PRETTY SIMPLE AND THE MECHANISM IS
REQUIRED BY OTHER ASPECTS OF THE PACKETIZATION.
╘HERE, THAT SHOULD TAKE CARE OF MOST OF THE MAJOR DESIGN DECISIONS.
4. ╨┴├╦┼╘╔┌┴╘╔╧╬
╨ACKETIZATION REFERS TO THE PROCESS OF TAKING A STREAM OF DATA AND BREAKING IT
UP INTO DISCRETE CHUNKS OF DATA. ┼ACH PACKET IS EASILY IDENTIFIED AND IS
PROCESSED AS A SINGLE UNIT. ╘HERE ARE MANY GENERAL ADVANTAGES TO USING
PACKETS. ╔F THERE IS A TRANSMISSION ERROR, THEN ONLY A SINGLE PACKET IS
CORRUPTED, AND THE RECOVERY WILL BE EASIER SINCE THE PACKET IS WELL
IDENTIFIED, AND ONLY IT NEEDS TO BE RECOVERED. ╨ACKETIZATION ALSO MEANS THAT
A LINK CAN BE SHARED BETWEEN MULTIPLE (LOGICAL) COMMUNICATION STREAMS FAIRLY
AND EFFICIENTLY, AND MEANS THAT A SINGLE COMMUNICATION STREAM CAN UTILIZE
MULTIPLE PHYSICAL LINKS WHERE FACILITIES EXIST.
╨ACKETS ALSO INTEGRATE WELL WITH MANY ╔╨├ SCHEMES, INCLUDING ╥EMOTE ╨ROCEDURE
├ALLS. ╔N FACT, YOU END UP EMULATING A PACKET-ORIENTED SCHEME EVEN IF YOU ARE
USING ╥╨├ OVER A STREAM-ORIENTED TRANSPORT SYSTEM. ╨ACKETS ALSO TAKE INTO
ACCOUNT THE LIMITED BUFFERING CAPACITY OF BOTH END SYSTEMS AND INTERMEDIATE
SYSTEMS, AND ALLOW FOR THE CONVENIENT IMPLEMENTATION OF FLOW CONTROL (EVEN IF
SAID FLOW CONTROL CONSISTS OF SIMPLY DROPPING PACKETS ON THE FLOOR). ╨ACKETS
ARE VERY USEFUL THINGS INDEED! ┴ND JUST THINK THAT BACK IN THE EARLY 1970S
PACKETS WERE DISMISSED AS BEING INFEASIBLE AND UNUSABLE.
┼ACH PACKET USED IN THE ╞╪ SYSTEM HAS FOUR PARTS TO IT: THE START CHARACTER,
THE USER DATA (PAYLOAD), THE ERROR-CHECK CHARACTERS, AND THE END CHARACTER.
╟RAPHICALLY, A PACKET HAS THE FOLLOWING FORMAT:
+------------------------+-----------+--------------+----------------------+
▄ ╙TART-OF-PACKET ├HAR ▄ ╨AYLOAD ▄ ┼RROR├HECK ▄ ┼ND-OF-PACKET ├HAR ▄
+------------------------+-----------+--------------+----------------------+
╘HE PAYLOAD CAN BE ARBITRARILY LONG, UP TO WHATEVER LIMIT THE TWO COMPUTERS
INVOLVED IN THE TRANSFER CAN HANDLE.
╘HE ERROR CHECK IS A 32-BIT (4-BYTE) ├YCLIC-╥EDUNDANCY-├HECK VALUE THAT
OCCUPIES THE LAST FOUR BYTES BEFORE THE ┼ND-OF-PACKET CHARACTER. ╘HE
IMPLEMENTATION, WHICH IS BASED ON A TABLE-LOOKUP METHOD, IS SO EFFICIENT THAT
IT IS AS FAST AS A SIMPLE ADD-UP CHECKSUM, EXCEPT MUCH MORE RELIABLE. ╒SING
THIS ERROR CHECK, THERE WILL BE APPROXIMATELY A ONE-IN-4,000,000,000 CHANCE
THAT A PACKET WITH AN ERROR IN IT WILL BE ACCEPTED HAS BEING ERROR-FREE.
╘HESE ARE PRETTY GOOD ODDS FOR OUR PURPOSES. ╘HE ├╥├ IS CALCULATED
EXCLUSIVELY ON THE RAW PAYLOAD DATA.
╘HE FOLLOWING SPECIAL CHARACTERS USED BY PACKETS ARE DEFINED:
╬┴═┼ ╚┼╪ ─┼├ ├ONTROL ═EANING
--------- ---- --- ------- --------
├╚╥_╙╘┴╥╘ 0X01 1 ├TRL-┴ ╨ACKET-START INDICATOR
├╚╥_┼╬─ 0X19 25 ├TRL-┘ ╨ACKET-END INDICATOR
├╚╥_┼╙├ 0X05 5 ├TRL-┼ ┼SCAPE CHARACTER FOR NEXT CODE
├╚╥_┴┬╧╥╘ 0X18 24 ├TRL-╪ ┴BORT TRANSFER IF REPEATED THREE TIMES
├╚╥_╪╧╬ 0X11 17 ├TRL-╤ ╙OFTWARE FLOW-START: AVOIDED
├╚╥_╪╧╞╞ 0X13 19 ├TRL-╙ ╙OFTWARE FLOW-STOP: AVOIDED
├╚╥_╤╒╧╘┼8 0X14 20 ├TRL-╘ ╤UOTE-8 THE NEXT 7-BIT SEQUENCE
├╚╥_╙╘┴╥╘ IS USED TO SIGNIFY THE START OF A NEW PACKET. ╘HIS CHARACTER IS
NOT ALLOWED TO BE USED ANYWHERE ELSE FOR ANY OTHER PURPOSE.
├╚╥_┼╬─ IS USED TO SIGNIFY THE END OF THE CURRENT PACKET, AND CANNOT BE USED
ANYWHERE ELSE. ╘HE REASON FOR USING SPECIAL CHARACTERS TO MARK THE BEGINNING
AND THE ENDING OF A PACKET IS TO ALLOW FOR EASY ERROR RECOVERY AFTER A
COMMUNICATION FAILURE. ┴LL YOU DO IS SEARCH FOR THE NEXT ├╚╥_╙╘┴╥╘ CHARACTER
AFTER YOU TOSS AWAY A GARBLED PACKET AND YOU'RE BACK IN BUSINESS. ╔ AM
UNAWARE OF ANY REASONABLE ALTERNATIVES TO FRAMING PACKETS WITH A ├╚╥_╙╘┴╥╘
CHARACTER. ╒SING A ├╚╥_┼╬─ SPECIAL CHARACTER IS A CONVENIENCE.
├╚╥_┼╙├ IS USED TO "ESCAPE" THE NEXT CHARACTER. ╙INCE THERE ARE SPECIAL
CHARACTER CODES THAT CANNOT BE USED IN ANY OTHER WAY THAN THEIR INTENDED
FUNCTION (INCLUDING ├╚╥_╙╘┴╥╘ AND ├╚╥_┼╙├ ITSELF), THIS CHARACTER IS NEEDED.
╘HE CHARACTER FOLLOWING THE ├╚╥_┼╙├ CHARACTER MUST BE BETWEEN "@" AND "_"
(0X40 AND 0X5F) IN THE ┴╙├╔╔ CHART, OR BE THE CHARACTER "?" (0X3F). ╘HE
CHARACTER FOLLOWING THE ├╚╥_┼╙├ IS THEN "AND"ED WITH THE VALUE 0X1F TO MASK
OFF THE "LETTER" BITS AND TURN IT INTO A CONTROL CHARACTER IN THE RANGE OF
0X00 TO 0X1F (THE SAME RANGE AS THE SPECIAL CONTROL CHARACTERS) AND THE
"ESCAPE SEQUENCE" IS TREATED AS A SINGLE CHARACTER OF USER DATA. ╔F THE
CHARACTER FOLLOWING THE ├╚╥_┼╙├ IS A "?", THEN A CODE OF 0X7F IS INTERPRETED
INSTEAD. ╒SING A CHARACTER FOLLOWING THE ESCAPE THAT IS DIFFERENT FROM THE
CHARACTER BEING REPRESENTED ALLOWS FOR GREATER RESILIANCE OF THE PROTOCOL IN
THE PRESENCE OF BITS BEING GARBLED OR BYTES BEING DROPPED. ┴LL SPECIAL
CHARACTERS IN A PACKET EXCEPT FOR THE STARTING AND ENDING CHARACTERS ARE
ESCAPED AS DESCRIBED ABOVE.
├╚╥_┴┬╧╥╘ CAN BE TYPED BY THE USER INTO A TERMINAL PROGRAM AT ANY TIME TO SHUT
DOWN THE SERVER.
├╚╥_╪╧╬ AND ├╚╥_╪╧╞╞ CAN CAUSE PROBLEMS WITH INTERMEDIATE DEVICES ON SOME
SYSTEMS, SO THE ╞╪ PROTOCOL DOES NOT USE THESE CHARACTER CODES AT ALL; IT
PURPOSELY AVOIDS THEM AND USES ESCAPE SEQUENCES (├╚╥_┼╙├) FOR THEM INSTEAD.
├╚╥_╤╒╧╘┼8 IS USED TO RE-GENERATE 8-BIT DATA OVER A 7-BIT LINK. ╦ERMIT USES
THIS SAME TECHNIQUE. ╫HEN THIS CHARACTER IS ENCOUNTERED IN THE RECEIVE
STREAM, THE NEXT CHARACTER IS EXTRACTED AND IS "OR"ED WITH A VALUE OF 0X80 TO
GIVE IT A "1" IN THE HIGH-BIT POSITION. ╘HE ├╚╥_╤╒╧╘┼8 CHARACTER CAN ALSO BE
FOLLOWED BY A ├╚╥_┼╙├ CODE, WHICH IS INTERPRETED AS ABOVE AND THEN "OR"ED WITH
THE 0X80 VALUE.
╧NE OF THE DISADVANTAGES OF USING THIS SCHEME IS THAT EACH BYTE IN THE RANGE
OF 0X80 AND 0XFF TAKES AT LEAST TWO BYTES TO TRANSMIT AND SOME OF THEM THREE.
╔F FACT, FOR MANY BINARY FILES IT MAY BE FASTER TO UUENCODE THE FILE AND
TRANSFER THE RESULTING TEXT, SINCE UUCODE HAS A STATIC ENCODING OVERHEAD OF
33% WHEREAS THIS QUOTING SCHEME HAS AN EXPECTED OVERHEAD OF 50% (PLUS THE
├╚╥_┼╙├ OVERHEAD). ╧F COURSE, THIS FEATURE IS INTENDED TO BE USED AS A LAST
RESORT IF YOU CANNOT GET AN 8-BIT CONNECTION.
╙O THERE YOU HAVE IT. ┼VERY MESSAGE SENT BETWEEN THE CLIENT AND THE SERVER
IS ENCAPSULATED IN A PACKET AS SPECIFIED ABOVE. ╨ACKETIZATION ALLOWS FOR
CONVENIENT ERROR DETECTION AND RECOVERY AND WORKS WELL WITH OUR INTERPROCESS
COMMUNICATION SCHEME.
╧NE IMPLEMENTATION NOTE ABOUT THE PACKETIZATION HAS TO DO WITH BUFFERING. ╧N
THE ╒NIX HOST, IT IS ADVANTAGEOUS TO ENCODE A PACKET INTO A MEMORY BUFFER AND
THEN SEND OUT THAT BUFFER IN A SINGLE "WRITE" OPERATION. ╘HIS LESS OPERATING-
SYSTEM OVERHEAD (WHICH MAY OR MAY NOT BE SIGNIFICANT) BUT MORE IMPORTANTLY,
IT MEANS THAT THE PACKET WILL BE SENT BETWEEN INTERMEDIATE COMMUNICATION
DEVICES AS EFFICIENTLY AS POSSIBLE. ╧N MY LOCAL ╒NIX SYSTEM, ╔ CONNECT TO
A TERMINAL SERVER AND TO MY ╒NIX HOST THROUGH THAT. ╨ERFORMING SINGLE-BYTE
WRITES ON THE ╒NIX HOST MEANS THAT THE BYTES ARE SENT IN INDIVIDUAL ┼THERNET
PACKETS BETWEEN THE ╒NIX HOST AND THE TERMINAL SERVER, AND ENCOUNTER MORE
OVERHEAD AND COMMUNICATION DELAYS. ╫HEN ╔ CHANGED THE PROGRAM TO SEND THE
╞╪ PACKET IN A SINGLE OPERATION, A SIGNIFICANT PERFORMANCE GAIN WAS REALIZED.
╞OR RECEIVING DATA ON THE ╒NIX HOST, THERE ISN'T MUCH YOU CAN DO OTHER THAN
READING ONE BYTE AT A TIME, SINCE THE RECEIVER DOESN'T KNOW WHEN A PACKET IS
GOING TO END. ╚OWEVER, THE SAME PROBLEM IS NOT ENCOUNTERED HERE THAT WAS
ENCOUNTERED WITH SENDING DATA BECAUSE DATA THAT IS RECEIVED BY THE ╒NIX HOST
BUT NOT "READ" BY THE USER PROGRAM ARE BUFFERED AND COLLECTED, SMOOTHING OUT
THE SYSTEM OVERHEAD, WHICH IS INSIGNIFICANT COMPARED TO THE MODEM SPEED. ╘HE
╒NIX PROGRAM USED THE "STDIN" AND "STDOUT" FILE STREAMS FOR RECEIVING AND
TRANSMITTING DATA, AND SETS THE TTY DRIVER TO TURN OFF ALL LINE-EDITING
FEATURES TO GET AT THE RAW BYTES.
╧N THE ├OMMODORE END, IT IS ADVANTAGEOUS TO READ DATA FROM THE MODEM DRIVER IN
CHUNKS, SINCE THE SYSTEM OVERHEAD IS SIGNIFICANT COMPARED TO THE MODEM SPEED.
╘HESE ARE SMALL COMPUTERS THAT WE ARE DRIVING TO THE MAX, YOU KNOW. ─ATA IS
READ FROM THE MODEM IN CHUNKS OF UP TO 255 BYTES (WHATEVER IS AVAILABLE AT THE
TIME) AND PROCESSED A BYTE AT A TIME FROM THE READ BUFFER. ╘HE ├╥├ IS
CALCULATED DURING PROCESSING, TO AVOID DOING THIS ON THE CRITICAL PATH. ╘HE
├╥├ CALCULATION IS PERFORMED AS AN OPERATION BY ITSELF SINCE THE OVERHEAD IS
VERY SMALL ON FAST PROCESSORS. ╘HE CHARACTER-SET TRANSLATION FOR TEXT FILES
WILL BE PERFORMED ON THE CRITICAL PATH (ON THE ├OMMODORE) SINCE IT IS MORE
CONVENIENT TO DO IT AT A HIGHER LAYER IN THE ╔╨├ SCHEME. ╘HE PACKET- HANDLING
SOFTWARE IS LOGICALLY AT A DISTINCT LAYER THAT DOESN'T HAVE TO WORRY ABOUT
HIGHER LAYERS. ╘HE NEXT LAYER UP IS LOGICALLY THE ╥╨├ LAYER AND THEN THE
FILE-TRANSFER LAYER.
5. ├╠╔┼╬╘/╙┼╥╓┼╥ ╧╨┼╥┴╘╔╧╬
┴S DISCUSSED PREVIOUSLY, THE CLIENT/SERVER INTERACTION IS BASED ON A ╥EMOTE
╨ROCEDURE ├ALL PARADIGM. ╘HUS, FOR EACH OPERATION, THE CLIENT SENDS A REQUEST
PACKET (MESSAGE) TO THE SERVER, AND THE SERVER PERFORMS THE REQUESTED
OPERATION AND SENDS BACK A REPLY (ACKNOWLEDGEMENT) MESSAGE TO THE CLIENT.
╘HERE ARE EIGHT REQUEST/ACK INTERACTIONS THAT ARE DEFINED FOR THE PROTOCOL:
TWO FOR CONNECTION MANAGEMENT, THREE FOR UPLOADING FILES, AND THREE FOR
DOWNLOADING FILES. ╘HE CLIENT IS IN CHARGE OF THE FILE-EXCHANGE SESSION
AND OF THE ERROR HANDLING.
4.1. ├╧╬╬┼├╘╔╧╬ ═┴╬┴╟┼═┼╬╘
╫HEN THE CLIENT STARTS UP, THE FIRST THING THAT IT DOES IS CONNECT TO THE
SERVER. ╘HE FORMAT OF THE MESSAGE THAT IT SENDS IS AS FOLLOWS:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ╥┼╤_├╧╬╬┼├╘ ('├')
1 1 PROTOCOL VERSION := 0X01
2 1 TRANSMIT BYTE SIZE: '7' OR '8' BITS
3 - ╙╔┌┼
╘HIS IS WHAT GETS PUT INTO THE THE "PAYLOAD" PORTION OF THE PACKET. ┴LL OF
THE MESSAGES USED IN THE PROTOCOL HAVE AN ┴╙├╔╔ LETTER IN THE FIRST BYTE THAT
IDENTIFIES WHAT THE MESSAGE TYPE IS. ┼ACH REQUEST HAS AN UPPERCASE LETTER AND
EACH ACKNOWLEDGEMENT HAS THE CORRESPONDING LOWERCASE LETTER.
╘HE CONNECTION-REQUEST MESSAGE IS FAIRLY SIMPLE: IT INCLUDES THE PROTOCOL
VERSION NUMBER AND THE NUMBER OF BITS WIDE THAT THE CLIENT THINKS THAT THE
COMMUNICATION CHANNEL IS. ╘HE VERSION NUMBER IS CURRENTLY ALWAYS 0X01 AND IS
INCLUDED FOR CROSS-COMPATIBILITY WITH FUTURE VERSIONS OF THE PROTOCOL. ╘HE
CHANNEL WIDTH IS ENCODED INTO EITHER A '7' OR AN '8' ┴╙├╔╔ CHARACTER. ╘HE
CLIENT WILL THINK THAT THE CHANNEL WIDTH IS SEVEN BITS ONLY IF YOU TELL IT
THIS ON THE COMMAND LINE.
╫HEN THE SERVER RECEIVES THE CONNECTION REQUEST, IT REPLIES WITH THE FOLLOWING
MESSAGE:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ┴├╦_├╧╬╬┼├╘ ('C')
1 1 PROTOCOL VERSION := 0X01
2 1 TRANSMIT BYTE SIZE: '7' OR '8' BITS
3 1 RECOMMENDED REQUEST BYTE SIZE: '7' OR '8' BITS
4 4 SERVER MAXIMUM TEXT-UPLOAD DATA SIZE: ╚/═/═/╠ WORD
8 4 SERVER MAXIMUM BINARY-UPLOAD DATA SIZE: ╚/═/═/╠ WORD
12 4 SERVER MAXIMUM TEXT-DOWNLOAD DATA SIZE: ╚/═/═/╠ WORD
16 4 SERVER MAXIMUM BINARY-DOWNLOAD DATA SIZE: ╚/═/═/╠ WORD
20 - ╙╔┌┼
╘HE "PROTOCOL VERSION" IS WHAT THE SERVER IS USING, CURRENTLY ALWAYS 0X01.
╘HE "TRANSMIT BYTE SIZE" IS THE SIZE THAT THE USER HAS SPECIFIED ON THE
COMMAND LINE THAT ACTIVATED THE SERVER, AND THE "RECOMMENDED REQUEST BYTE
SIZE" IS A '7' IF EITHER THE "TRANSMIT BYTE SIZE" OF THE EITHER THE CLIENT OR
SERVER IS SEVEN BITS, OR '8' OTHERWISE. ╘HIS IS WHAT SHOULD BE USED FOR THE
ALL SUBSEQUENT MESSAGES THAT ARE EXCHANGED.
╘HE SERVER'S REPLY ALSO INCLUDES THE MAXIMUM PACKET SIZES THAT IT CAN HANDLE
FOR UPLOADING AND DOWNLOADING BINARY AND TEXT FILES. ╘HE CLIENT THEN TAKES
THE "MIN" OF THE SERVER'S MAXIMUM PACKET SIZES AND ITS OWN, AND USES THE
RESULTING MAXIMUM PACKET SIZES FOR THE REST OF THE FILE EXCHANGE SESSION. ╘HE
MAXIMUM PACKET SIZES IN THE SERVER'S REPLY ARE ALL 32-BIT UNSIGNED INTEGERS
THAT ARE STORED FROM MOST-SIGNIFICANT TO LEAST-SIGNIFICANT BYTES (BIG ENDIAN
ORDER). ╔ PICKED BIG-ENDIAN ORDER BECAUSE THAT IS THE ORDER USED MOST
COMMONLY IN INTER-MACHINE PROTOCOLS.
╘HE REASON THAT THE CLIENT DOESN'T HAVE TO INFORM THE SERVER OF THE CLIENT'S
MAXIMUM PACKET SIZES IN ITS CONNECTION MESSAGE IS THAT THE MAXIMUM PACKET
SIZE TO USE IS INCLUDED WITH EACH REQUEST TO GET THE NEXT PACKET OF A DOWNLOAD
FILE. ╔T IS SUFFICIENT THAT THE CLIENT KNOWS THE FULL MAX-PACKET INFORMATION.
╥EALLY, THE "TRANSMIT BYTE SIZE" FIELD ISN'T NEEDED IN THE SERVER REPLY
MESSAGE EITHER, BUT ╔ WANTED THE PACKET-SIZE FIELDS TO BE SIZE-ALIGNED.
┴FTER ALL OF THE FILE EXCHANGING IS COMPLETED, THE CLIENT SENDS THE FOLLOWING
MESSAGE TO TERMINATE THE CONNECTION AND RETURN THE SERVER BACK TO ITS COMMAND-
LINE MODE:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ╥┼╤_─╔╙├╧╬╬┼├╘ ('╤')
1 - ╙╔┌┼
╫HEN THE SERVER RECEIVES THIS REQUEST, IT REPLIES WITH:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ┴├╦_─╔╙├╧╬╬┼├╘ ('Q')
1 - ╙╔┌┼
┴ND THEN EXITS LIKE IT SHOULD. ╬OTE THAT ONCE THE SERVER EXITS, IT CANNOT
ACCEPT ANY MORE PACKETS, SINCE THEY WOULD BE SENT TO WHATEVER COMMAND SHELL
YOU USE ON YOUR ╒NIX SYSTEM, AND WOULDN'T DO ANYTHING USEFUL, SO IF THE CLIENT
SENDS THE DISCONNECT MESSAGE BUT DOESN'T RECEIVE ANY REPLY, IT WILL TIME OUT
AND TELL THE USER THAT IT COULDN'T DISCONNECT CLEANLY FROM THE SERVER. ╘HIS
SHOULD BE A RARE OCCURRENCE. ┴NYWAY, WHAT THE USER WOULD DO THEN IS RE-ENTER
HIS TERMINAL PROGRAM AND SEND ├TRL-╪'S AT THE SERVER UNTIL IT EXITS LIKE IT
SHOULD HAVE.
╘HIS ARRANGEMENT ALLOWS US TO AVOID THE FAMOUS(?) "TWO ARMIES" PROBLEM THAT IS
INHERENT IN DISCONNECTING TWO CONNECTED PROCESSES: THERE IS NO "CLEAN" WAY TO
DO IT. ╫HAT SYSTEMS LIKE ┌-═ODEM AND ┬ERKELEY ╙OCKETS DO IS TO HAVE THE
SERVER WAIT FOR A PERIOD OF TIME THAT IS LONGER THAN ╬ TIMES THE TIMEOUT
PERIOD OF THE CLIENT SO THAT IF THERE IS A RETRANSMISSION OF THE DISCONNECTION
REQUEST, IT LIKELY THAT IT WILL BE RECEIVED AND PROCESSED CORRECTLY BY THE
SERVER. ╘HIS IS THE REASON (PRESUMABLY) THAT ┌-═ODEM DOES AN ANNOYING PAUSE
OF 15 SECONDS OR SO AFTER YOU FINISH TRANSFERRING FILES. ╔ THINK THAT MY
SOLUTION IS MUCH NICER, SINCE THE SERVER CAN EXIT IMMEDIATELY (EVEN THOUGH MY
SERVER DELAYS FOR 1 SECOND, JUST SO THAT YOUR SHELL PROMPT WILL BE CLEANLY IN
YOUR MODEM'S ┴╥╤ BUFFER WHEN YOU RE-ENTER YOUR TERMINAL PROGRAM, IF YOU HAVE A
HARDWARE-FLOW-CONTROL MODEM).
4.2. ╞╔╠┼ ╒╨╠╧┴─╔╬╟
╧KAY, SO BETWEEN CONNECTING TO AND DISCONNECTING FROM THE SERVER, ACTUAL
USEFUL STUFF HAPPENS, INCLUDING UPLOADING AND DOWNLOADING FILES. ╘HE
UPLOADING AND DOWNLOADING REQUESTS OPERATE MUCH LIKE THE REGULAR FILE
OPERATIONS OF OPEN, CLOSE, READ, AND WRITE. ╥EALLY, THE ╞╪ PROTOCOL MAKES THE
SERVER PROGRAM A SPECIAL KIND OF FILE SERVER.
╫HEN THE CLIENT DECIDES THAT IT WANTS TO UPLOAD A FILE, IT FIRST INFORMS THE
SERVER ABOUT THIS BY SENDING THE FOLLOWING MESSAGE:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ╥┼╤_╒╨╠╧┴─_╧╨┼╬ ('╒')
1 1 DATA TYPE: 'T'=TEXT FILE, 'B'=BINARY FILE: 'D'=DIRECTORY
2 4 ESTIMATED FILE SIZE: ╚/═/═/╠ WORD
6 2 PERMISSIONS ("-----SGR:WXRWXRWX"), LIKE ╒NIX, ╚:╠
8 12 MODIFIED DATE: ┬├─ FORMAT: <┘┘:┘┘:══:──:HH:MM:SS:TT:TW:╟╟:GG:AA>
20 N FILENAME, NULL-TERMINATED
20+N - ╙╔┌┼
╘HE "DATA TYPE" FIELD TELLS WHETHER A TEXT OR BINARY FILE WILL BE UPLOADED.
╘HERE IS A PROVISION FOR "UPLOADING" A DIRECTORY ENTRY (AS PART OF UPLOADING
AND DOWNLOADING ENTIRE DIRECTORY HIERARCHIES), BUT SUPPORT FOR THIS IS NOT
IMPLEMENTED YET. ┴LSO, IT MAKES NO DIFFERENCE TO A ╒NIX SYSTEM WHETHER A FILE
CONTAINS TEXT OR BINARY DATA, BUT IT MAY MAKE A DIFFERENCE TO OTHER OPERATING
SYSTEMS (LIKE ═ESS-─╧╙). ╘HE "ESTIMATED FILE SIZE" FIELD ISN'T REALLY USED
EITHER, BUT IT ALLOWS THE SERVER TO MAKE INTELLIGENT DECISIONS ABOUT
PRE-ALLOCATING SPACE, BUFFERING, ETC., IF IT NEEDED TO. ╚OWEVER, IT IS
CURRENTLY NOT FILLED IN BY THE CLIENT, SINCE FILE-SIZE INFORMATION IS
DIFFICULT TO EXTRACT FROM ├OMMODORE-─╧╙. ╘HE FILE SIZE IS AN UNSIGNED 32-BIT
QUANTITY.
╘HE PERMISSIONS FIELD IS CURRENTLY NOT SUPPORTED BY THE SERVER, BUT IT IS
INTENDED TO ALLOW FILE PERMISSIONS TO BE PRESERVED WHEN PASSING FILES FROM ONE
SYSTEM TO ANOTHER. ╘HE INTERPRETATION OF THE 16 BITS OF THIS FIELD IS LIKE IT
IS WITH THE ╒NIX OPERATING SYSTEM: "RWX" BITS FOR THE OWNER, GROUP, AND OTHER,
AND EXECUTE-AS-OWNER, EXECUTE-AS-GROUP BITS. ╘HE OWNER-ID AND GROUP-ID FIELDS
AREN'T INCLUDED SINCE THEY ARE GENERALLY NOT PORTABLE ACROSS SYSTEMS, AND EVEN
IF THEY WERE, WE USUALLY WANT TO RECEIVE FILES AS OUR OWN OWNER-ID AND OUR OWN
GROUP-ID.
╘HE "MODIFICATION DATE" FIELD IS NOT CURRENTLY FILLED IN EITHER, SINCE THIS
INFORMATION IS EVEN HARDER TO COME ACROSS WITH ├OMMODORE-─╧╙, BUT WHEN IT IS,
IT WILL HAVE A 12-BYTE ┬├─ FORMAT. ╘HE "┘┘:┘┘:══:──:HH:MM:SS" SUB-FIELDS
SHOULD BE EASY ENOUGH TO FIGURE OUT, AND THE "TT:T" FIELDS CONTAIN THOUSANDTHS
OF SECONDS. ╘HE "W" FIELD CONTAINS THE DAY OF THE WEEK, CODED AS 0-6 FOR
╙UNDAY TO ╙ATURDAY, AND 7 FOR "UNKNOWN". ╘HE "╟╟:GG" FIELDS CONTAIN THE
NUMBER OF HOURS AND MINUTES THAT YOUR TIME ZONE IS OFF FROM ╟═╘. ╔F THE
NUMBER IS NEGATIVE (IN THE WESTERN HEMISPHERE), THEN THE REGULAR POSITIVE
NUMBER OF HOURS WILL BE USED, EXECEPT THAT THE 0X80 BIT OF THE HOURS BYTE WILL
BE SET. ╞INALLY, THE "AA" SUB-FIELD IS USED TO ENCODE THE ACCURACY OF THE
TIMESTAMP. ╘HE WAY THAT IT IS INTERPRETED IS THAT THE TIME VALUE IS ACCURATE
TO PLUS/MINUS 2^AA MILLISECONDS. ╞OR EXAMPLE, IF MY CLOCK WERE ACCURATE TO
WITHIN ONE SECOND, THEN THIS FIELD WOULD BE SET TO 10 IN ┬├─ (2^10 ==
1024MS). ┴ VALUE OF 99 MEANS "UNKNOWN" (OR THAT THE CLOCK COULD BE OFF BY
MANY BILLIONS OF BILLIONS OF YEARS).
╔ DECIDED TO GO ALL OUT IN DEFINING THE DATE FIELD SO THAT IT WILL BE USEFUL
IN THE FUTURE WHEN "WORLD CONSCIOUSNESS" WILL BE MUCH MORE IMPORTANT THAN
IT IS TODAY.
┴ND LAST BUT CERTAINLY NOT LEAST, THE FILENAME IS ENCODED IN ┴╙├╔╔ WITH A
TRAILING ZERO BYTE.
╒PON RECEIVING THIS REQUEST, THE SERVER WILL ATTEMPT TO CREATE A FILE
ACCORDING TO YOUR SPECIFICATIONS, AND WILL SEND BACK A REPLY OF THE FORM:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ┴├╦_╒╨╠╧┴─_╧╨┼╬ ('U')
1 1 ERROR CODE: 'Y'=SUCCESSFUL, 'N'=OPEN UNSUCCESSFUL
2 - ╙╔┌┼
╘HE "ERROR CODE" FIELD TELLS WHETHER THE OPEN OPERATION WAS SUCCESSFUL OR
NOT. ╔F IT WAS, THEN THE CLIENT CAN CONTINUE WITH UPLOADING ITS FILE; IF NOT,
THEN THAT FILE CANNOT BE UPLOADED (AND THAT THE UPLOAD CHANNEL DOESN'T NEED TO
BE CLOSED). ╔T'S UP TO THE CLIENT WHETHER TO GO ON TO THE NEXT FILE, ABORT,
OR ASK THE USER FOR HELP. ╘HE CLIENT WILL CURRENTLY REPORT AN ERROR TO THE
USER AND THEN GO ONTO THE NEXT FILE. ╧F COURSE, IT'S LIKELY THAT WHATEVER
CAUSED THE ERROR IN CREATING THE CURRENT FILE WILL ALSO CAUSE AN ERROR IN
CREATING SUBSEQUENT FILES (INSUFFICIENT ACCESS PERMISSIONS ON THE CURRENT
DIRECTORY, DISK FULL, ETC.). ╘HE SERVER WILL OVERWRITE ANY EXISTING FILE
WITH THE SAME NAME (SINCE ASKING PERMISSION, ETC., WOULD REQUIRE EXTRA
MECHANISM, AND WOULD PROBABLY BE A NUISANCE ANYWAY).
╔F THE UPLOAD CHANNEL IS OPENED SUCCESSFULLY, THEN THE PACKETS OF UPLOAD
DATA SHOULD BE SENT TO THE SERVER ONE AT A TIME, UNTIL ALL OF THE DATA IS
UPLOADED. ╘HE CLIENT SENDS THE FOLLOWING MESSAGE TO THE SERVER TO UPLOAD
A PACKET OF DATA:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE; ╥┼╤_╒╨╠╧┴─_╨┴├╦┼╘ ('╥')
1 1 UPLOAD SEQUENCE NUMBER
2 4 DATA LENGTH: ╚/═/═/╠ WORD
6 N DATA
6+N - ╙╔┌┼
╘HE "UPLOAD SEQUENCE NUMBER", WHICH WAS DESCRIBED BEFORE, IS USED TO MAKE SURE
THAT RETRANSMISSIONS OF PACKETS ARE DETECTED AND HANDLED PROPERLY, SO THAT
EACH PACKET OF DATA ONLY APPEARS IN THE FILE ONCE. ╘HE "DATA LENGTH" FIELD
TELLS THE NUMBER OF USER DATA BYTES THAT FOLLOW IN THE PACKET, AND THEN THE
ACTUAL USER DATA BYTES APPEAR. ╘HE "DATA LENGTH" FIELD IS ACTUALLY REDUNDANT,
BUT ╔ FIGURED THAT IT WOULD MAKE PROGRAMMING A LITTLE EASIER, AND ALLOWS
ADDITIONAL ERROR CHECKING. ╬ORMALLY, EACH UPLOAD-DATA PACKET WILL CONTAIN
THE MAXIMUM-PACKET-SIZE NUMBER OF BYTES OF USER DATA (ACCORDING TO WHETHER
TEXT OR BINARY DATA IS BEING UPLOADED), EXCEPT FOR THE LAST PACKET, WHICH
WILL CONTAIN THE NUMBER OF DATA BYTES THAT ARE LEFT IN THE FILE. ╚OWEVER,
EACH PACKET IS ALLOWED TO CONTAIN ANYWHERE FROM 1 TO THE MAXIMUM-PACKET-
SIZE NUMBER OF BYTES: WHATEVER THE CLIENT WISHES TO USE. ╓ARIABLE-SIZED
PACKETS ARE A ╟OOD ╘HING (╘═, ╨AT. ╨END.). ┘OU WILL NOTE THAT THE DATA-
SIZE VALUES ARE ALSO WHAT WILL BE USED FOR THE "READ" AND "WRITE" SYSTEM
CALLS ON THE CLIENT AND SERVER, RESPECTIVELY. ╔/╧ WILL BE DONE IN BIG,
EFFICIENT CHUNKS.
╒PON RECEIVING EACH UPLOAD PACKET, THE SERVER REPLIES WITH THE FOLLOWING
ACKNOWLEDGEMENT MESSAGE:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ┴├╦_╒╨╠╧┴─_╨┴├╦┼╘ ('R')
1 1 UPLOAD SEQUENCE NUMBER
2 - ╙╔┌┼
╔ DON'T THINK THAT THE "SEQUENCE NUMBER" FIELD IS ACTUALLY NECESSARY HERE, BUT
IT IS INCLUDED TO ALLOW FOR FUTURE EXPANSION AND TO PROVIDE REDUNDANCY FOR
PROTOCOL-ERROR CHECKING.
╫HEN THE CLIENT HAS UPLOADED ALL OF THE PACKETS OF THE FILE CURRENTLY BEING
UPLOADED, IT THEN SENDS THE FOLLOWING MESSAGE:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ╥┼╤_╒╨╠╧┴─_├╠╧╙┼ ('╓')
1 - ╙╔┌┼
╘HIS WILL CLOSE THE UPLOAD CHANNEL AND WILL FINISH WRITING THE UPLOADED FILE
TO THE ╒NIX FILE SYSTEM. ╘HE SERVER WILL THEN RESPOND WITH THE FOLLOWING
MESSAGE TO ACKNOWLEDGE THE REQUEST:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ┴├╦_╒╨╠╧┴─_├╠╧╙┼ ('V')
1 4 NUMBER OF BYTES UPLOADED: ╚/═/═/╠ WORD
5 - ╙╔┌┼
╘HE "NUMBER OF BYTES" FIELD IS ACTUALLY REDUNDANT, BUT IS USED FOR ADDITIONAL
ERROR CHECKING.
4.3. ╞╔╠┼ ─╧╫╬╠╧┴─╔╬╟
─OWNLOADING FILES IS ANALOGOUS TO UPLOADING THEM: FIRST WE OPEN THE DOWNLOAD
CHANNEL/FILE, THEN WE DOWNLOAD THE PACKETS, AND THEN WE CLOSE THE DOWNLOAD
CHANNEL.
╘O OPEN THE DOWNLOAD CHANNEL, THE CLIENT SENDS THE FOLLOWING REQUEST TO THE
SERVER:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ╥┼╤_─╧╫╬╠╧┴─_╧╨┼╬ ('─')
1 - ╙╔┌┼
╘O WHICH THE SERVER REPLIES WITH:
╧╞╞ ╙╔┌ ─┼╙├
--- --- -----
0 1 CODE: ┴├╦_─╧╫╬╠╧┴─_╧╨┼╬ ('D')
1 1 DATA TYPE: '0'=NO MORE FILES (EOM),'T'=TEXT,'B'=BIN,'E'=ERR,'D'=DIR
2 4 ESTIMATED FILE SIZE: ╚/═/═/╠ WORD
6 2 PERMISSIONS ("-----SGR:WXRWXRWX"), LIKE ╒NIX, ╚:╠
8 12 MODIFIED DATE: ┬├─ FORMAT: <┘┘:┘┘:══:──:HH:MM:SS:TT:TW:╟╟:GG:AA>
20 N FILENAME, NULL-TERMINATED
20+N - ╙╔┌┼